Hive与SparkSQL语法差异
一、相同函数差异
1、Spark运行时用到的hash函数,与Hive的哈希算法不同,如果使用hash(),结果和Hive的hash()会有差异
2、Hive和SparkSQL使用grouping sets生成的GROUPING_ID不一致
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会抛出异常
7、to_date()函数有些值的情况不一致
示例:Spark中to_date('2017-12-13-15') 为null,而Hive中则为2017-12-13,因为Hive使用的SimpleDateFormat.parse(xxx,"yyyy-MM-dd"),只会解析到pattern的位置,会忽略-15的字符。
8、Spark中字符串小数比较结果可能与预期有差别
示例:SELECT '0.1' = 0会返回true,因为此时0.1会被转换为int,相当于(CAST(‘0.1’ AS INT) = 0)。
9.parse_url()函数中,如果http URL中有不符合格式的脏子串(如空格等),Hive会去掉脏子串且匹配成功,而Spark的匹配方式更严格,要求URL字符串本身是符合正常格式的,否则会匹配不到返回空
10、datediff()函数中,比如0000-00-00执行datediff两者会存在差异
示例:
datediff(CURRENT_DATE, '0000-00-00')
结果:(1)hive: 737986 (2)spark: NULL
11、unix_timestamp()函数中,对于24点Spark认为是非法的返回NULL,而Hive任务是正常的
示例:
unix_timestamp(concat('2020-06-01', ' 24:00:00'))
结果: (1)hive:1591027200 (2)spark: NULL
12、date_sub()、date_add()函数中,当月或者日是00时Hive仍然会返回一个日期,但是Spark会返回NULL
二、仅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” 这样会遇到报错:Error in query: nondeterministic expressions are only allowed in Project, Filter, Aggregate or Window
2、创建临时表时,Spark不支持直接赋值null
示例:
create table tmp.tmp_xxx
stored as orc as
select pv_id,null as apply_tp_cdfrom sourceTable
解决方案:在SparkSQL中将null强转成期望类型,比如字段类型如果是string,则使用"cast (null as string)"强制转换类型
3、SparkSQL无法读取字段类型为void的表
示例:null as xxx,或create table xxx stored as orc as select xxx语句建表时,from和where等条件后的源头数据中正好某个字段等值全为null
解决方案:此情况一般在Hive建临时表时字段值全为null时出现,Hive会将该字段类型识别为void,而SparkSQL不支持void类型,按照第2条将表重建即可解决
4、SparkSQL中如果表达式没有指定别名,SparkSQL会将整个表达式作为别名。如果表达式中包含特殊符号(如逗号),则CTAS建表会失败
示例:
create table test_bigdata using parquet as select nvl(dummy, '1') from dual;
上述查询中,SparkSQL会把nvl(dummy, '1')直接作为别名建表,导致建表失败,会报错:Error in query: Cannot create a table having a column whose name contains commas in Hive metastore.
解决方案:在复杂表达式后指定别名:
create table test_bigdata
using parquet as
select nvl(dummy, '1') as dummy from dual;
5、SparkSQL没有regexp udf
示例:
where 1 regexp 1 --sparksql 和hive均ok
where 1 rlike 1 --sparksql 和hive均ok
where regexp(1,1) --sparksql没有此udf,hive有
6、SparkSQL的from_utc_timestamp()中参数只支持timestamp、date、string类型,而Hive支持bigint等各种类型的输入
示例:
SELECT from_utc_timestamp(1L, 'GMT');
解决方案:通过自带的udf组合使用,例如:
select concat(from_unixtime(floor(cast(ts as bigint)/1000)),regexp_extract(format_number(cast(ts as bigint)/1000, 3), '(.*?)(\\.[0-9][0-9][0-9])', 2))from ( select 1527061637123L as ts) a
7、个别Avro表有字段定义成uniontype,Spark解析字段定义会报错:Cannot recognize hive type string: xxxx
8、有些UDF用到了SimpleDateFormat,Spark在执行时会涉及多线程,Hive没这个问题,SimpleDateFormat非线程安全
解决方案:(1)修改UDF代码,把static相关变量去掉换成非static的变量
(2)把SimpleDateFormat设置成ThreadLocal的: java - Date Conversion with ThreadLocal - Stack Overflowhttps://stackoverflow.com/questions/18589986/date-conversion-with-threadlocal
(3)使用 joda-time来转换日期时间
三、仅Spark支持
1、SparkSQL允许在join on条件中使用or等不等值关联语句,Hive中不允许,只能用等值关联
示例:
select t1.xx, t2.xxx from students t1
left join class t2on t1.classId >= t2.idor t1.classname = t2.name
order by t1.id;
Hive与SparkSQL语法差异相关推荐
- 全方位测评Hive、SparkSQL、Presto 等七个大数据查询引擎,最快的竟是……| 程序员硬核测评...
现在大数据组件非常多,众说不一,那么每个企业在不同的使用场景里究竟应该使用哪个引擎呢?易观Spark实战营团队选取了Hive.SparkSQL.Presto.Impala.HAWQ.ClickHous ...
- Impala和Hive之间的SQL差异
Impala和Hive之间的SQL差异 Impala的SQL语法遵循SQL-92标准,并且在内置功能等领域包括许多行业扩展.有关将SQL代码从各种数据库系统移植到Impala的一般讨论,请参见将SQL ...
- Sqlite基础及其与SQLServer语法差异
1 TOP 这是一个大家经常问到的问题,例如在SQLSERVER中可以使用如下语句来取得记录集中的前十条记录: SELECT TOP 10 * FROM [index] ORDER BY indexi ...
- MySQL和PostgreSQL的常用语法差异
背景 在去年的DBMS评比中,PostgreSQL夺冠,PostgreSQL一直保持上升姿态,越来越多的客户选择使用PostgreSQL,还有一部分客户从MySQL迁往PostgreSQL,那Post ...
- spark2.0.1安装部署及使用jdbc连接基于hive的sparksql
2019独角兽企业重金招聘Python工程师标准>>> 1.安装 如下配置,除了配置spark还配置了spark history服务 #先到http://spark.apache.o ...
- 从VC++到GCC移植:谈两者的语法差异
从VC++到GCC移植:谈两者的语法差异 许式伟 (版权声明) 2007-1-28 类型引用 template <class T> class Foo { typedef T:: ...
- sparksql语法,读json
sparksql语法,读json --样本 [hadoop@node1 resources]$ pwd /home/hadoop/spark-1.5.2-bin-hadoop2.6/examples/ ...
- 【十八掌●武功篇】第十掌:Hive之基本语法
小系列列表 [十八掌●武功篇]第十掌:Hive之基本语法 [十八掌●武功篇]第十掌:Hive之原理与优化 [十八掌●武功篇]第十掌:Hive之高级知识 [十八掌●武功篇]第十掌:Hive之安装过程实践 ...
- spark2.0 sql java_spark2.0.1安装部署及使用jdbc连接基于hive的sparksql
1.安装 如下配置,除了配置spark还配置了spark history服务 #先到http://spark.apache.org/根据自己的环境选择编译好的包,然后获取下载连接 cd /opt mk ...
最新文章
- android p获取通话记录_HBuilder 获取通话记录 (Android)
- golang协程特点
- 剑指Spring源码(一)
- 【渝粤教育】国家开放大学2019年春季 2507学前儿童艺术教育(音乐) 参考试题
- 十二月份找工作好找吗_小儿推拿师工作好找吗?工资高吗?
- linux 远程调试
- Python拷贝(深拷贝deepcopy与浅拷贝copy)
- JQuery 使用笔记 2013.09.05
- 《线性代数及其应用》笔记-第三章
- Topaz Adjust AI Mac
- odoo13 订单模板设置_Odoo 13开发者文档:视图
- VBOX虚拟机的网络设置
- OSPF报文与LSA
- EPMS System Analysis——AD验证、权限设计
- [转]关于模糊控制的理解
- Google镜像站点 资源收集
- freeswitch如何判断挂机方
- 微信开源PhxQueue:高可用、高可靠、高性能的分布式队列**
- 【Kubernetes离线安装】
- windows黑客编程系列(十一):按键记录
热门文章
- maven引入依赖时,识别不到本地仓库jar包问题
- python程序运行按什么键_太惨!学Python方法用错,直接从入门到放弃!
- cocos2dx移植android平台
- 外用药祛除痤疮,对皮肤的影响。
- 对“判断内六角规格项目”一些改进与完善
- 电脑蓝牙打电话-总结(二、InTheHand的C#库)
- mac编辑文件提示: Can‘t open file for writing
- 水星(MERCURY)MW150RM迷你无线路由器Client模式设置
- Linux双系统蓝屏,装双系统其中有一个系统进不去(蓝屏)
- 你是我生命的一次奢侈