| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Hive与SparkSQL语法差异 -> 正文阅读 |
|
[大数据]Hive与SparkSQL语法差异 |
一、相同函数差异1、Spark运行时用到的hash函数,与Hive的哈希算法不同,如果使用hash(),结果和Hive的hash()会有差异 2、Hive和SparkSQL使用grouping sets生成的GROUPING_ID不一致 3、regexp_extract未匹配上的话,在HIVE里返回是null,但在Spark里返回是空字符 示例:
HIVE返回null,Spark返回空字符。 4、SparkSQL中row_number的over中不能省略sort by?或order by 示例:
或
其中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两者会存在差异 示例:
结果:(1)hive: 737986? ? ? (2)spark: NULL 11、unix_timestamp()函数中,对于24点Spark认为是非法的返回NULL,而Hive任务是正常的 示例:
结果: (1)hive:1591027200? ? (2)spark: NULL 12、date_sub()、date_add()函数中,当月或者日是00时Hive仍然会返回一个日期,但是Spark会返回NULL 二、仅Hive支持1、SparkSQL关联on条件不支持函数rand() 示例:
解决方案:在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 示例:
解决方案:在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建表会失败 示例:
上述查询中,SparkSQL会把nvl(dummy, '1')直接作为别名建表,导致建表失败,会报错:Error in query: Cannot create a table having a column whose name contains commas in Hive metastore. 解决方案:在复杂表达式后指定别名:
5、SparkSQL没有regexp udf 示例:
6、SparkSQL的from_utc_timestamp()中参数只支持timestamp、date、string类型,而Hive支持bigint等各种类型的输入 示例:
解决方案:通过自带的udf组合使用,例如:
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 Overflow ? ? ? ? ? ? ? ? ? ?(3)使用 joda-time来转换日期时间 三、仅Spark支持1、SparkSQL允许在join on条件中使用or等不等值关联语句,Hive中不允许,只能用等值关联 示例:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/22 8:56:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |