云服务器内容精选

  • Spark3.3.x不支持v1表 说明: Spark2.4.x支持datasourcev1、datasourcev2表。Spark3.3.x不支持v1表。 具体说明请参考 DLI datasourceV1表和datasourceV2表。 Spark2.4.x:支持datasourcev1、datasourcev2表。 Spark3.3.x:不支持支持datasourcev1表。 升级引擎版本后是否对作业有影响: 有影响,建议在Spark 2.4.5版本整改到v2表后再升级Spark 3.3.1,具体操作指导可以参考DLI datasourceV1表和datasourceV2表的中的示例。
  • eventlog的压缩格式设置为zstd 说明: Spark3.3.x版本中,spark.eventLog.compression.codec的默认值被设置为zstd,Spark在压缩事件日志时将不再支持使用spark.io.compression.codec的参数值。 Spark2.4.x:使用spark.io.compression.codec的参数值作为eventlog的压缩格式。 Spark3.3.x:spark.eventLog.compression.codec默认设置为zstd。 升级引擎版本后是否对作业有影响: 有影响,eventlog的压缩格式发生变化。
  • PySpark-pandas支持版本变更 说明: Spark2.4.x:在Spark 2.4.x版本中,PySpark并没有要求指定Pandas的版本。 Spark3.3.x:从Spark 3.3.x版本开始,PySpark需要0.23.2或更高版本的pandas才能使用pandas相关功能,如toPandas、 createDataFrame from pandas DataFrame等。 升级引擎版本后是否对作业有影响: 依赖版本变化,有影响,需要排查是否涉及。
  • 默认情况下空的input split不创建partition 说明: Spark2.4.x:默认情况下空的input split将创建partition。 Spark3.3.x:默认情况下空的input split不创建partition。 Spark3.3.x时spark.hadoopRDD.ignoreEmptySplits=true。 升级引擎版本后是否对作业有影响: 有影响,需要判断是否使用分区名做业务判断。
  • Spark3.3.x不再支持将Apache Mesos作为资源管理器 说明: Spark2.4.x:Spark 2.4.x版本中使用Apache Mesos作为资源管理器。 Spark3.3.x:Spark3.3.x不再支持将Apache Mesos作为资源管理器。 升级引擎版本后是否对作业有影响: 功能增强,Spark 2.4.x版本中使用Mesos作为资源管理器,升级到Spark 3.3.x后,你需要考虑切换到其他资源管理器。
  • 以command命名DataFrameWriter触发的查询 在Spark 3.2.x版本中,当DataFrameWriter触发的查询执行被发送给QueryExecutionListener时,这些查询的名称总是被设置为command。而在Spark 3.1及更早版本中,这些查询的名称可能是save、insertInto或saveAsTable之一,这取决于具体的操作。 说明: DataFrameWriter触发的查询执行在发送到QueryExecutionListener时,始终以command命名 Spark2.4.x:名称为save、insertInto、saveAsTable中的一个 Spark3.3.x:command命名 升级引擎版本后是否对作业有影响: 有影响
  • Spark将不可为null的模式转换为可空 说明: 在Spark 2.4.x版本中,当用户指定的schema包含不可为空的字段时,Spark会将这些不可为null的模式转换为可空的。 但是在Spark 3.3.x版本中,Spark尊重用户指定的schema中的nullability,即如果字段被定义为不可为空,Spark会保持该配置要求,不会自动转换为可空的字段。 Spark2.4.x:在Spark 2.4.x版本中,当用户指定的schema包含不可为空的字段时,Spark会将这些不可为null的模式转换为可空的。 Spark3.3.x:Spark不会自动转换为可空的字段。 如果希望在Spark 3.3.x版本中恢复到Spark 2.4.x版本的执行方式,您可以通过将 spark.sql.legacy.respectNullabilityInTextDatasetConversion设置为true来实现。 升级引擎版本后是否对作业有影响: 有影响。 示例代码: 执行sql: spark.read.schema(StructType( StructField("f1", LongType, nullable = false) :: StructField("f2", LongType, nullable = false) :: Nil) ).option("mode", "DROPMALFORMED").json(Seq("""{"f1": 1}""").toDS).show(false); Spark 2.4.5 |f1 |f2 | +---+---+ |1 |0 | Spark 3.3.1 |f1 |f2 | +---+----+ |1 |null|
  • PySpark-PyArrow支持版本变更 说明: Spark2.4.x:在Spark 2.4.x版本中,PySpark并没有要求指定PyArrow的版本。 Spark3.3.x:从Spark 3.3.x版本开始,PySpark需要0.12.1或更高版本的PyArrow才能使用PyArrow相关功能,如Pandas_udf、toPandas等。 升级引擎版本后是否对作业有影响: 依赖版本变化,有影响,需要排查是否涉及。
  • from_unixtime函数差异 说明: Spark2.4.x: 以Asia/Shanghai时区的 -2209017600 为例,返回值为1900-01-01 00:00:00。 Spark3.3.x: 以Asia/Shanghai时区的 -2209017943 为例,返回值为 1900-01-01 00:00:00。 升级引擎版本后是否对作业有影响: 有影响,需要检查使用该函数的场景。 示例代码: 在SQL界面配置: spark.sql.session.timeZone=Asia/Shanghai Spark 2.4.5 执行SQL读取数据: select from_unixtime(-2209017600); 查询结果: 1900-01-01 00:00:00 Spark 3.3.1 执行SQL读取数据: select from_unixtime(-2209017600); 查询结果 1900-01-01 00:05:43
  • 新增支持Parallel Multi-Insert 说明: Spark3.3.x版本中新增支持Parallel Multi-Insert,如果SQL存在multi-insert的场景,在同一个SQL里插入到多个表中,这类SQL在Spark开源本身是串行处理的,性能受到制约。针对这类SQL,Spark3.3.x版本中DLI新增支持multi-insert并行化的优化处理,可以让所有的insert都并发执行,提升处理性能。 在使用时需配置开启以下功能开关(默认关闭): spark.sql.lazyExecutionForDDL.enabled=true spark.sql.parallelMultiInsert.enabled=true 升级引擎版本后是否对作业有影响: DLI功能增强,增强multi-insert并行化特性,提升作业运行的可靠性。
  • 新增支持Enhance Reuse Exchange 说明: Spark3.3.x版本中新增支持Enhance Reuse Exchange,SQL的对应plan存在sort merge join可重用的条件,通过打开相应开关spark.sql.execution.enhanceReuseExchange.enabled,可以实现SMJ plan node重用。 在使用时需配置开启以下功能开关(默认关闭): spark.sql.execution.enhanceReuseExchange.enabled=true 升级引擎版本后是否对作业有影响: DLI功能增强。
  • TIMESTAMP类型字段读取差异 说明: TIMESTAMP类型字段读取差异,对于Asia/Shanghai时区,时间在1900-01-01 08:05:43之前的值,Spark 2.4.5版本写入后Spark 3.3.1版本读取值与Spark 2.4.5版本读取值不同。 Spark2.4.x: 以Asia/Shanghai时区的 1900-01-01 00:00:00 为例,通过Spark 2.4.5版本队列写入,Spark 2.4.5版本读取后得到的值为 -2209017600000。 Spark3.3.x: 以Asia/Shanghai时区的 1900-01-01 00:00:00 为例,通过Spark 2.4.5版本队列写入,Spark 3.3.1版本配置spark.sql.parquet.int96RebaseModeInRead=LEGACY,读取后得到的值为 -2209017943000。 升级引擎版本后是否对作业有影响: 有影响,需要评估TIMESTAMP类型字段的使用方式。 示例代码: 在SQL界面配置: spark.sql.session.timeZone=Asia/Shanghai Spark 2.4.5 create table parquet_timestamp_test (id int, col0 string, col1 timestamp) using parquet; insert into parquet_timestamp_test values (1, "245", "1900-01-01 00:00:00"); 执行SQL读取数据: select * from parquet_timestamp_test; 查询结果: id col0 col1 1 245 -2209017600000 Spark 3.3.1 spark.sql.parquet.int96RebaseModeInRead=LEGACY 执行SQL读取数据: select * from parquet_timestamp_test; 查询结果: id col0 col1 1 245 -2209017943000
  • 导出 CS V文件时保留特殊字符的引号 说明: Spark2.4.x: 在Spark 2.4.x版本中,导出CSV文件时,如果字段值中包含特殊字符如换行符(\n)和回车符(\r),并且这些特殊字符被引号(例如双引号")包围,Spark会自动处理这些引号,在导出的CSV文件中舍弃这些引号。 例如,字段值"a\rb"在导出时不会包含引号。 Spark3.3.x: 在Spark 3.3.x版本中,优化了对于CSV文件的导出处理,如果字段值中包含特殊字符,并且这些特殊字符被引号包围,Spark会保留这些引号。 例如:字段值"a\rb"在导出时,引号仍被保留在最终的CSV文件中。 升级引擎版本后是否对作业有影响: 对查询结果无影响,但导出文件样式有影响。 示例代码: 准备数据: create table test_null2(str1 string,str2 string,str3 string,str4 string); insert into test_null2 select "a\rb", null, "1\n2", "ab"; 执行sql: SELECT * FROM test_null2; Spark 2.4.5 a b 1 2 ab Spark 3.3.1 a b 1 2 ab 导出查询结果到obs,查看csv文件内容: Spark 2.4.5 a b,"","1 2",ab Spark 3.3.1 "a b",,"1 2",ab
  • 新增支持自适应Skip partial agg功能的配置 说明: Spark3.3.x版本中新增支持自适应Skip partial agg功能,即当Partial Agg效果不佳时,可以直接跳过,避免Partial Agg带来的额外性能消耗。相关参数: spark.sql.aggregate.adaptivePartialAggregationEnabled:用于控制是否启用自适应Skip partial agg功能。当设置为true时,Spark会根据运行时的统计数据动态决定是否跳过部分聚合。 spark.sql.aggregate.adaptivePartialAggregationInterval:该参数用于配置分析间隔,即在处理了多少行数据之后,Spark会进行一次分析,用来决定是否需要跳过部分聚合。 spark.sql.aggregate.adaptivePartialAggregationRatio:该参数是判断是否跳过的阈值,用于判断“已处理的group分组/已处理的行数”的比例。如果这个比例大于配置的阈值,则认为预聚合效果不好,此时Spark可以选择跳过部分聚合,避免进一步的性能损失。 在使用时系统先按照spark.sql.aggregate.adaptivePartialAggregationInterval配置的间隔进行分析,当处理的行数到达间隔之后,再计算”已处理的group分组/已处理的行数”,如果比例大于配置的阈值,则认为预聚合效果不好,此时可以直接选择跳过。 升级引擎版本后是否对作业有影响: DLI功能增强。
  • unix_timestamp函数差异 说明: 对于Asia/Shanghai时区,小于1900-01-01 08:05:43的值。 Spark2.4.x: 以Asia/Shanghai时区的 1900-01-01 00:00:00 为例,返回值为 -2209017600。 Spark3.3.x: 以Asia/Shanghai时区的 1900-01-01 00:00:00 为例,返回值为 -2209017943。 升级引擎版本后是否对作业有影响: 有影响,需要检查使用该函数的场景。 示例代码: 在SQL界面配置: spark.sql.session.timeZone=Asia/Shanghai Spark 2.4.5 执行SQL读取数据: select unix_timestamp('1900-01-01 00:00:00'); 查询结果: -2209017600 Spark 3.3.1 执行SQL读取数据: select unix_timestamp('1900-01-01 00:00:00'); 查询结果 -2209017943