hive full outer join_Spark基础:Hive兼容

a0cf2e8005ee2669add2c3f05e7b6151.png

Spark SQL设计的时候就考虑了与Hive元数据、SerDes、UDF的兼容性。

1 与现有的Hive数仓集成

Spark SQL thrift JDBC服务器被设计成开箱即用,无需修改任何Hive的配置就可以在Spark SQL中使用。

2 支持的Hive特性

Spark SQL支持很多Hive的特性,比如:

  • Hive的查询,包括:SELECT, GROUP BY, ORDER BY, CLUSTER BY, STORT BY
  • 所有的Hive操作,包括:关系操作符,如 =, <=>, ==, <>, <, >, >=, <= 等 ( 这里的<=>操作比较罕见,相当于ifnull(a!=b, false),比如 1<=>2 值为false, 1<=>1 值为true );数学运算符,如 +, -, *, /, %等;逻辑操作符,如 AND, &&, OR, || 等;复杂构造器;数学函数,如 sign, ln, cos 等;字符串函数,如 instr, length, printf。
  • 用户自定义函数, UDF
  • 用户自定义聚合函数,UDAF
  • 用户自定义序列化格式,SerDes
  • 窗口函数
  • 关联操作,如 JOIN, {LEFT | RIGHT | FULL} OUTER JOIN, LEFT SEMI JOIN, CROSS JOIN
  • 合并操作
  • 子查询,如 SELECT col FROM (SELECT a+b AS col from t1) t2
  • 抽样 sample
  • 解释执行计划 explain
  • 分区表 以及 动态分区插入
  • 视图 VIEW
  • DDL函数,如 CREATE TABLE, CREATE TABLE AS SELECT, ALTER TABLE
  • 支持大部分Hive的数据类型,包含:TINYINT, SMALLINT, INT, BIGINT, BOOLEAN, FLOAT, DOUBLE, STRING, BINARY, TIMESTAMP, DATE, ARRAY<>, MAP<>, STRUCT<>

3 不支持的Hive特性

下面是Hive在Spark中不支持的特性,大部分特性再Hive中也很少使用。

主要的Hive特性

分桶表,桶是基于hive分区表再次进行hash分区。Spark SQL目前不支持(可以通过spark api进行分桶)。

这里再回顾下分桶表和分区表。分区表是基于目录对数据进行物理的划分,查询的时候可以通过分区字段快速过滤不满足的数据,提升扫表的速度。分桶表是基于某个字段进行hash打散到固定的几个桶里,每个桶对应一个物理文件,他们都存储在同一个文件夹中。当两个表join的时候可以通过分桶的hash信息快速知道那两个文件需要放在一起join(包含相同列值的需要在一起进行join操作,列值通过分桶文件可以快速进行区分)。如果分桶操作搭配上排序操作,那么整个表的存储就可以看做是 桶排序的一种实现,当需要顺序合并所有的数据时,也会提升排序效率。

难以理解的Hive特性

  • UNION类型
  • 唯一JOIN
  • 列统计信息搜集,spark不能再后台去统计列的信息,只能依赖hive元数据进行统计。

Hive的输入输出格式

Hive CLI的格式,专门用于在CLI中进行展示的格式,目前Spark仅支持TextOutputFormat。Hadoop存档。

Hive优化

有一些Hive中优化策略在Spark中是不支持的,因为有一些优化在Spark这种内存模型中是不必要的,另一些在未来的Spark版本中将会得到支持。

  • 块级别的bitmap索引(Block level bitmap)和虚拟列(virtual column),主要用于构建索引
  • 自动决定reduce和groupby时的并行度,目前在Spark中如果想要控制并行度,可以通过命令进行配置 SET spark.sql.shuffle.partitions=[num_tasks];
  • 元数据查询,对于仅仅依赖元数据就能得到结果的查询,spark仍然会启动计算。
  • 数据倾斜标志skrew data flag,Spark SQL并不会使用该标记。
  • join中的STREAMTABLE提示,spark不会使用该提示。在Hive里面可以通过代码/*+streamtable(s)*/显示的告诉查询引擎,哪个是大表,避免错误把大表进行广播join。
  • 合并多个小文件:如果输出结果包含太多小文件,Hive可以进行自动合并,spark没有这个功能。

Hive UDF/UDTF/UDAF

注意不是所有的Hive UDF/UDTF/UDAF在spark sql中都支持,下面是一些不支持的api:

  • getRequiredJars 和 getRequiredFiles 方法用于在UDF中自动加载jar包
  • initialize(StructObjectInspector) 目前暂不支持, spark目前仅适用一个已经标记为弃用的接口 initialize(ObjectInspector[])
  • configure 用于初始化 MapredContext,在Spark中不支持
  • close 用于释放资源,spark sql执行的时候不会调用该方法
  • reset 用于在重用UDAF时,重新进行初始化;spark目前不支持udaf的重用
  • getWindowingEvaluator 在聚合的时候基于固定的窗口进行优化,spark不支持

3 与Hive不兼容的地方

下面是Spark和Hive不兼容的地方:

  • SQRT(n), 如果n<0, Hive返回 null , Spark返回 NaN
  • ACOS(n), 如果n<-1或n>1,Hive返回 null , Spark返回 NaN
  • ASIN(n), 如果n<-1或n>1,Hive返回 null , Spark返回 NaN

更多内容关注公众号:

http://weixin.qq.com/r/-yjG3iTEbnkRrWC9933t (二维码自动识别)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值