当前位置:   article > 正文

SparkSQL与Hive语法差异_sparksql和hivesql语法有什么区别

sparksql和hivesql语法有什么区别

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

一、相同函数差异

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

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

 

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

示例:

   Hive:

  Spark:

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条件不支持函数rand()

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

解决方案:在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的表

现象:

解决方案:此情况一般为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')直接作为别名建表,导致建表失败

 

解决方案:在复杂表达式后指定别名: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面试题汇总

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/767008
推荐阅读
相关标签
  

闽ICP备14008679号