云服务器内容精选

  • 导出 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
  • 新增支持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功能增强。
  • 空值分区的查询语句不同 说明: Spark2.4.x: Spark 3.0.1或更早版本中,如果分区列是字符串类型,则将其解析为其文本表示形式的字符串文本,例如字符串“null”。 通过part_col='null'查询空值分区的数据。 Spark3.3.x: `PARTITION(col=null)`始终在分区规范中解析为null,即使分区列是字符串类型。 通过part_col is null查询空值分区的数据。 升级引擎版本后是否对作业有影响: 有影响,涉及对空值分区的查询需要适配 示例代码: 准备数据: CREATE TABLE test_part_null (col1 INT, p1 STRING) USING PARQUET PARTITIONED BY (p1); INSERT INTO TABLE test_part_null PARTITION (p1 = null) SELECT 0; 执行sql: select * from test_part_null; Spark 2.4.5 0 null Spark 2.4.5版本执行select * from test_part_null where p1='null'可查到分区数据。 Spark 3.3.1 0 Spark 3.3.1版本执行select * from test_part_null where p1 is null才可查询到数据。
  • 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
  • 对分区表数据的处理方式不同 说明: datasourcev1分区外表,路径下已经存在不带uuid的分区路径数据。 执行insert overwrite partition操作,Spark3.3.x会清除之前不带uuid的分区数据,Spark2.4.x不会清理。 Spark2.4.x: 保留不带uuid分区路径下数据。 Spark3.3.x: 会删除不带uuid分区路径下数据。 升级引擎版本后是否对作业有影响: 有影响,会清理脏数据。 示例代码: 准备数据: obs://bucket1/test/overwrite_datasource下创建pt=pt1目录,并导入一个parquet数据文件。 create table overwrite_datasource(id int,name string,pt string) using parquet PARTITIONED by(pt) LOCATION 'obs://bucket1/test/overwrite_datasource'; SELECT * FROM overwrite_datasource1 where pt='pt1'两个版本均查询不到数据。 执行sql: insert OVERWRITE table overwrite_datasource partition(pt='pt1') values(2,'aa2'); Spark 2.4.5 保留了pt=pt1目录。 Spark 3.3.1 删除了pt=pt1目录。
  • 新增支持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并行化特性,提升作业运行的可靠性。
  • 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
  • SHOW TABLES输出的schema的变化 说明: SHOW TABLES的输出schema从database: string变成了namespace: string。 Spark2.4.x:SHOW TABLES的输出schema是database: string。 Spark3.3.x: SHOW TABLES的输出schema从database: string变成了namespace: string。 其中对于内置catalog,namespace字段被命名为database;对于v2 catalog没有isTemporary字段。 如果你希望在Spark 3.3.x版本中恢复到Spark 2.4.x版本的样式,可以通过将spark.sql.legacy.keepCommandOutputSchema设置为true来实现。 升级引擎版本后是否对作业有影响: 有影响,请排查作业中与SHOW TABLES有关的使用方法,并按上述说明适配新版本的使用要求。 示例代码: 执行sql: show tables; Spark 2.4.5 database tableName isTemporary db1 table1 false Spark 3.3.1 namespace tableName isTemporary db1 table1 false
  • DayTimeIntervalType的映射类型变化为Duration 说明: 在ArrowWriter和ArrowColumnVector开发者API中,从Spark 3.3.x版本开始,Spark SQL中的DayTimeIntervalType类型被映射到Apache Arrow的Duration类型。 Spark2.4.x:DayTimeIntervalType被映射到Apache Arrow的Interval类型。 Spark3.3.x:DayTimeIntervalType被映射到Apache Arrow的Duration类型。 升级引擎版本后是否对作业有影响: 有影响,DayTimeIntervalType的映射类型发生变化。
  • SHOW TABLE EXTENDED输出的schema变化 说明: SHOW TABLE EXTENDED的输出schema从database: string变成了namespace: string。 Spark2.4.x:SHOW TABLE EXTENDED的输出schema是database: string。 Spark3.3.x: SHOW TABLE EXTENDED的输出schema从database: string变成了namespace: string。 其中对于内置catalog,namespace字段被命名为database;对于v2 catalog没有变化。 如果你希望在Spark 3.3.x版本中恢复到Spark 2.4.x版本的样式,可以通过将spark.sql.legacy.keepCommandOutputSchema设置为true来实现。 升级引擎版本后是否对作业有影响: 有影响,请排查作业中与SHOW TABLES有关的使用方法,并按上述说明适配新版本的使用要求。 示例代码: 执行sql: show table extended like 'table%'; Spark 2.4.5 database tableName isTemporary information db1 table1 false Database:db1... Spark 3.3.1 namespace tableName isTemporary information db1 table1 false Database:db1...
  • timestamps减法表达式返回值类型变化 说明: Spark2.4.x:timestamps减法表达式,如select timestamp'2021-03-31 23:48:00'- timestamp'2021-01-01 00:00:00'返回CalendarIntervalType类型的值。 Spark3.3.x:timestamps减法表达式,如select timestamp'2021-03-31 23:48:00'- timestamp'2021-01-01 00:00:00'返回DayTimeIntervalType类型的值。 在Spark3.3.x版本中如果希望恢复到Spark2.4.x之前的映射类型,可以通过设置配置项spark.sql.legacy.interval.enabled为true来实现。 升级引擎版本后是否对作业有影响: 有影响,映射后的数据类型发生变化。
  • 不再支持混合使用年月字段和日时间字段 说明: Spark2.4.x:单位列表间隔文字可以混合使用年月字段(YEAR 和 MONTH)和日时间字段(WEEK、DAY、...、MICROSECOND)。 Spark3.3.x:单位列表间隔文字不能混合使用年月字段(YEAR 和 MONTH)和日时间字段(WEEK、DAY、...、MICROSECOND)。提示无效输入。 在Spark3.3.x版本中如果希望恢复到Spark2.4.x之前的使用方式,可以通过设置配置项spark.sql.legacy.interval.enabled为true来实现。 升级引擎版本后是否对作业有影响: 有影响。
  • 包含自动生成的别名时创建视图失败 说明: Spark2.4.x:Spark2.4.x版本中如果语句中包含自动生成的别名,则正常执行且无提示信息。 Spark3.3.x:Spark3.3.x版本中如果语句中包含自动生成的别名,则创建/更改视图将失败。 在Spark3.3.x版本中如果希望恢复到Spark2.4.x之前的使用方式,可以通过设置配置项spark.sql.legacy.allowAutoGeneratedAliasForView为true来实现。 升级引擎版本后是否对作业有影响: 有影响。 示例代码: 准备数据: create table test_view_alis(id1 int,id2 int); INSERT INTO test_view_alis VALUES(1,2); 执行sql: create view view_alis as select id1 + id2 from test_view_alis; Spark 2.4.5 执行成功 Spark 3.3.1 报错 Not allowed to create a permanent view `view_alis` without explicitly assigning an alias for expression (id1 + id2) 如果在Spark 3.3.1版本添加如下参数后,执行SQL成功。 spark.sql.legacy.allowAutoGeneratedAliasForView = true