SparkSQL与Hive语法差异

一、相同函数差异
二、仅Hive支持
三、仅Spark支持
四、Parquet表格式相关
五、备注

一、相同函数差异

1.Spark运行时用到的hash函数,与 Hive 的哈希算法不同,如果使用hash(),结果和Hive的hash()会有差异

解决方案:SparkSQL中将hash()修改为兼容Hive的函数hive_hash()

2.Hive和SparkSQL使用grouping sets生成的GROUPING_ID不一致

示例:

Hive:

SparkSQL与Hive语法差异

Spark:

SparkSQL与Hive语法差异

3.regexp_extract未匹配上的话,在HIVE里回是null,但在Spark里返回是空字符

示例:regexp_extract(‘00000000’, ‘^(0{1,})?([0-9a-zA-Z]+)?’, 2),HIVE 返回null,Spark 返回空字符

4.SparkSQL 中row_number的over中不能省略sort by 或order by

示例:

row_number()over(partition by 字段1,字段2 order by 字段3) as row_num

row_number()over(distribute by 字段1,字段2 sort by 字段3) as row_num

其中 order by或sort by不能省略

5.grouping_id()函数生成的数据不同

6.reflect()函数中,如果入参有非法数据或者null,hive会返回null,而spark会抛出异常

解决方案:SparkSQL中将reflect()修改为兼容Hive的函数hive_reflect()

二、仅Hive支持

1.SparkSQL关联on条件不支持 函数ran d()

示例:on (concat(rand(), t1.xxx)) = t2.xxx 这样会遇到以下报错:

SparkSQL与Hive语法差异

解决方案:在on语句之前利用子查询将rand()处理好,如”concat(rand(), t1.xxx) as bitrary”,然后放到on语句后进行关联,如”on t1.bitrary = t2.xxx”

2.创建临时表时,Spark不支持直接赋值null

示例:create table brock_tmp.tmp_18061294

stored as orc as

select pv_id,

null as apply_tp_cd

from table

解决方案:在SparkSQL中将null强转成期望类型,比如字段类型如果是string,则使用”cast (null as string)”强制转换类型

3.SparkSQL 无法读取字段类型为void的表

现象:

SparkSQL与Hive语法差异

解决方案:此情况一般为Hive建临时表时查询存在”null as xx”的情况,Hive会将该字段类型识别为void,而SparkSQL不支持void类型,按照第2条将表重建即可解决

4.SparkSQL中如果表达式没有指定别名,SparkSQL会将整个表达式作为别名。如果表达式中包含特殊符号(如逗号),则CTAS建表会失败

示例:create table test_bigdata_20190119 using parquet as select nvl(dummy, ‘1’) from dual;

上述查询中,SparkSQL会把nvl(dummy, ‘1’)直接作为别名建表,导致建表失败

SparkSQL与Hive语法差异

SparkSQL与Hive语法差异

解决方案:在复杂表达式后指定别名:create table test_bigdata_20190119 using parquet as select nvl(dummy, ‘1’)as dummy from dual;

三、仅Spark支持

1.SparkSQL允许在join on条件中使用or等不等值关联语句,Hive中不允许,只能用等值关联。

示例:select t1.xx, t2.xxx from students t1

left join class t2

on t1.classId >= t2.id

or t1.classname = t2.name

order by t1.id;

四、Parquet表格式相关

1.SparkSQL中如果建立Parquet Datasource表(create table using parquet as,使用动态分区对不同分区同时写入数据时会报错,除Parquet Datasource以外格式无该问题

解决方案:如果有动态分区同时多分区写入的业务需求,可使用 “create table stored as orc as”“create table using orc as”等方式建表。

2.创建Parquet格式表时,如果字段类型为数组,该字段不能有空值,否则读写时会报错。

解决方案:如果业务需求中遇到数组类型字段且其中需要有空值的,可使用” create table stored as orc as“或” create table using orc as“等方式建表。

五、备注

1.SparkSQL语法以Spark-2.3.X为准

关注微信公众号【飞哥大数据】,回复666 获取2022年100+公司面试真题,以及spark与flink面试题汇总

Original: https://blog.csdn.net/weixin_40893503/article/details/124664664
Author: 风中的大数据
Title: SparkSQL与Hive语法差异

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/813652/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球