云服务器内容精选

  • 空值分区的查询语句不同 说明: 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; Spark2.4.5 0 null Spark2.4.5版本执行select * from test_part_null where p1='null'可查到分区数据。 Spark3.3.1 0 Spark3.3.1版本执行select * from test_part_null where p1 is null才可查询到数据。
  • 日期加减时间字段间隔后的返回值类型的变化 说明: date +/-只有日期时间字段(如date'2011-11-11')的间隔+间隔12小时返回类型变化。 Spark2.4.x:在Spark 2.4.x中,当对定义为FloatType或DoubleType的JSON属性进行日期加减操作时,例如date'2011-11-11'加上或减去一个时间间隔(如12小时),返回的类型是日期(DateType)。 Spark3.3.x:Spark 3.3.x版本中,对于同样的操作,返回的类型变为时间戳(TimestampType),用于保持与Hive的兼容性。 升级引擎版本后是否对作业有影响: 有影响。 示例代码: 执行sql: select date '2011-11-11' - interval 12 hour Spark2.4.5 2011-11-10 Spark3.3.1 1320897600000
  • 对分区表数据的处理方式不同 说明: 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'); Spark2.4.5 保留了pt=pt1目录。 Spark3.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并行化特性,提升作业运行的可靠性。
  • Spark SQL支持Char/Varchar类型 说明: Spark2.4.x:在Spark2.4.x版本中,Spark SQL表字段不支持Char/Varchar类型,当指定为Char/Varchar类型时会强制转换为String类型。 Spark3.3.x:Spark SQL表字段支持CHAR/CHARACTER和VARCHAR类型。 升级引擎版本后是否对作业有影响: 无影响。 示例代码: 准备数据: create table test_char(id int,name varchar(24),name2 char(24)); 执行sql: show create table test_char; Spark2.4.5 create table `test_char`(`id` INT,`name` STRING,`name2` STRING) ROW FORMAT... Spark3.3.1 create table test_char(id INT,name VARCHAR(24),name2 VARCHAR(24)) ROW FORMAT...
  • 新增支持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功能增强。
  • 导出 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; Spark2.4.5 a b 1 2 ab Spark3.3.1 a b 1 2 ab 导出查询结果到obs,查看csv文件内容: Spark2.4.5 a b,"","1 2",ab Spark3.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功能增强。
  • Spark3.3.x不再支持使用“0$”指定第一个参数 说明: format_string(strfmt, obj, ...) 和 printf(strfmt, obj, ...) 中的 strfmt 将不再支持使用“0$”指定第一个参数,第一个参数应始终由“1$”引用当使用参数索引来指示参数在参数列表中的位置。 Spark2.4.x:%0和%1均可表示第一个参数。 Spark3.3.x:不再支持%0。 升级引擎版本后是否对作业有影响: 有影响,请作业中如涉及使用%0需修改以适配Spark3.3.x。 示例代码1: 执行sql: SELECT format_string('Hello, %0$s! I\'m %1$s!', 'Alice', 'Lilei'); Spark2.4.5 Hello, Alice! I'm Alice! Spark3.3.1 DLI.0005: The value of parameter(s) 'strfmt' in `format_string` is invalid: expects %1$, %2$ and so on, but got %0$. 示例代码2: 执行sql: SELECT format_string('Hello, %1$s! I\'m %2$s!', 'Alice', 'Lilei'); Spark2.4.5 Hello, Alice! I'm Lilei! Spark3.3.1 Hello, Alice! I'm Lilei!
  • 新增支持解析“+Infinity”、“+INF”和“-INF”类型字符串的值 说明: Spark2.4.x:当从定义为FloatType 或 DoubleType的JSON属性读取值时,Spark2.4.x仅支持解析“Infinity”和“-Infinity”。 Spark3.3.x:当从定义为FloatType 或 DoubleType的JSON属性读取值时,Spark3.3.x除了支持解析“Infinity”和“-Infinity”之外,还支持解析字符串“+Infinity”、“+INF”和“-INF”。 升级引擎版本后是否对作业有影响: 功能增强,无影响
  • ADD PARTITION新增支持使用类型化文字 说明: Spark2.4.x: 在Spark 2.4.x版本中,使用ADD PARTITION时,如果使用类型化文字(例如date'2020-01-01'),分区值会被解析为字符串值date'2020-01-01',会生成一个非法的日期值,因此会添加一个值为null的分区。 正确的做法是使用字符串值,例如ADD PARTITION(dt = '2020-01-01') Spark3.3.x:在Spark 3.3.x版本中,对分区操作支持使用类型化文字,支持使用ADD PARTITION(dt = date'2020-01-01'),并且可以正确地将分区值解析为日期类型,而不是字符串。 升级引擎版本后是否对作业有影响: 有影响,ADD PARTITION中对于类型化文字的处理方式的变化。 示例代码: 准备数据: create table test_part_type (id int,name string,pt date) PARTITIONED by (pt); insert into test_part_type partition (pt = '2021-01-01') select 1,'name1'; insert into test_part_type partition (pt = date'2021-01-01') select 1,'name1'; 执行sql: select id,name,pt from test_part_type; (配置参数spark.sql.forcePartitionPredicatesOnPartitionedTable.enabled为false) Spark2.4.5 1 name1 2021-01-01 1 name1 Spark3.3.1 1 name1 2021-01-01 1 name1 2021-01-01
  • Spark3.3.x版本中空字符串无引号。 说明: 默认情况下,空值在CSV数据源中,2.4.5版本空字符串为"",升级到spark3.3.1后空字符串无引号。 Spark2.4.x:空值在CSV数据源中为""。 Spark3.3.x:空值在CSV数据源中无引号。 如需在Spark3.3.x版本中恢复Spark2.4.x的格式,可以通过设置spark.sql.legacy.nullValueWrittenAsQuotedEmptyStringCsv为 true来实现。 升级引擎版本后是否对作业有影响: 有影响,导出orc文件中null值存储形式不同。 示例代码: 准备数据: create table test_null(id int,name string) stored as parquet; insert into test_null values(1,null); 导出csv查看文件内容 Spark2.4.5 1,"" Spark3.3.1 1,
  • describe function返回结果不同 说明: 如果function不存在,describe function会执行失败。 Spark2.4.x:DESCRIBE函数仍然可以运行并打印“Function:func_name not found” Spark3.3.x:函数不存在的提示信息变更为失败。 升级引擎版本后是否对作业有影响: 有影响,describe function 相关API的返回信息不同。 示例代码: 执行sql: describe function dli_no(dli_no不存在) Spark2.4.5 执行成功,function_desc内容: Function:func_name not found Spark3.3.1 执行失败,DLI.0005: Undefined function: dli_no……
  • 返回信息明确告知不支持指定表外部属性 说明: 表外部属性`external`变为保留。如果指定外部属性,某些命令将执行失败。 Spark2.4.x:通过 `CREATE TABLE ... TBLPROPERTIES`和`ALTER TABLE ... SET TBLPROPERTIES`指定external属性,命令执行成功,但实际上external属性被静默忽略,表依然是managed table。 Spark3.3.x: 通过 `CREATE TABLE ... TBLPROPERTIES`和`ALTER TABLE ... SET TBLPROPERTIES`指定external属性,命令将会失败。 如需在Spark3.3.x版本中恢复Spark2.4.x的使用方式,可以通过设置spark.sql.legacy.notReserveProperties为 true来实现。 升级引擎版本后是否对作业有影响: 有影响,涉及相关用法需要适配。 示例代码: 执行sql: CREATE TABLE test_external(id INT,name STRING) TBLPROPERTIES('external'=true); Spark2.4.5 执行成功。 Spark3.3.1 DLI.0005: The feature is not supported: external is a reserved table property, please use CREATE EXTERNAL TABLE.
  • 默认配置spark.sql.adaptive.enabled=true 说明: Spark2.4.x:在Spark 2.4.x版本中,默认情况下spark.sql.adaptive.enabled配置项的值是false,即自适应查询执行(Adaptive Query Execution,简称AQE)特性是关闭的。 Spark3.3.x:从Spark3.3.x-320版本起开始默认开启AQE特性,即spark.sql.adaptive.enabled配置项的值是true。 升级引擎版本后是否对作业有影响: DLI功能增强,spark.sql.adaptive.enabled的默认参数值发生变化。