云服务器内容精选

  • 空值分区的查询语句不同 说明: 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版本中空字符串无引号。 说明: 默认情况下,空值在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的默认参数值发生变化。
  • 表刷新对依赖项缓存的影响 说明: 升级Spark3.3.x版本后表刷新会清除表的缓存数据,但保持依赖项缓存。 Spark2.4.x:在Spark 2.4.x版本中,当执行表刷新操作(如REFRESH TABLE)时,不会保留依赖项(例如视图)的缓存数据。 ALTER TABLE .. ADD PARTITION ALTER TABLE .. RENAME PARTITION ALTER TABLE .. DROP PARTITION ALTER TABLE .. RECOVER PARTITIONS MSCK REPAIR TABLE LOAD DATA REFRESH TABLE TRUNCATE TABLE spark.catalog.refreshTable Spark3.3.x:升级Spark3.3.x版本后表刷新会清除表的缓存数据,但保持依赖项缓存。 升级引擎版本后是否对作业有影响: 升级新版本引擎后会增加原有依赖项的缓存数据。
  • 日期差值返回结果的类型变化 说明: date减法表达式(如 date1 - date2)返回DayTimeIntervalType的值 Spark2.4.x:返回CalendarIntervalType。 Spark3.3.x:返回DayTimeIntervalType。 恢复之前的行为,将 spark.sql.legacy.interval.enabled 设置为 true 升级引擎版本后是否对作业有影响: 有影响,日期差值返回结果默认类型变化。
  • 单位到单位间隔的映射类型的变化 说明: Spark2.4.x:Spark2.4.x版本中单位到单位的间隔(如 INTERVAL '1-1' YEAR TO MONTH)和单位列表间隔(如 INTERVAL '3' DAYS '1' HOUR)将转换为CalendarIntervalType类型。 Spark3.3.x:在Spark3.3.x版本中,单位到单位的间隔(如 INTERVAL '1-1' YEAR TO MONTH)和单位列表间隔(如 INTERVAL '3' DAYS '1' HOUR)将转换为 ANSI 间隔类型:YearMonthIntervalType或DayTimeIntervalType类型。 在Spark3.3.x版本中如果希望恢复到Spark2.4.x之前的映射类型,可以通过设置配置项 spark.sql.legacy.interval.enabled为true来实现。 升级引擎版本后是否对作业有影响: 有影响,映射后的数据类型发生变化。