在Hive中,如果一个很大的表和一个小表做join,Hive可以自动或者手动使用MapJoin,将小表的数据加载到DistributeCache中,从而在使用Map Task扫描大表的同时,完成join,这对join的性能提升非常多。
在SparkSQL中,目前还不支持自动或者手动使用MapJoin。变通的方法是,将小表进行cache,然后再和大表做join。 SparkSQL中cache的作用就是将小表数据广播到每一个Worker的内存中,和加载到DistributeCache中是一个道理。
具体实现如下:
create table t_lxw1234 as SELECT a.cookieid, b.brand, a.orderid AS ad_activity_id, a.orderitemid AS ad_id, a.siteid AS media_id, a.inventoryid AS ad_area_id, SUM(1) AS pv FROM lxw1234.t_log a join lxw1234.t_config b ON (a.orderid = b.ad_activity_id) WHERE a.pt = '2015-06-15' GROUP BY a.cookieid, b.brand, a.orderid, a.orderitemid, a.siteid, a.inventoryid
上面SQL中,大表 lxw1234.t_log 有3亿多条记录,而小表 lxw1234.t_config 中只有1000多条,一般情况下,SparkSQL的执行计划如下图所示:
可以看出,先分别扫描两张表,之后在做ShuffledHashJoin,而在这一步,由于小表数据量非常小,也就是能关联上的键值很少,因此这里发生了数据倾斜,导致最后的几个task处理的数据量非常大,直到内存溢出而报错,如图:
SparkSQL中提供了CACHE TABLE的命令,可以将一个表或者查询进行广播,命令如下:
CACHE TABLE t_config AS SELECT ad_activity_id,brand FROM lxw1234.t_config
这样,等于是将t_config这张table加载到DistributeCache中,接下来再用这张内存表和大表做join:
create table t_lxw1234 as SELECT a.cookieid, b.brand, a.orderid AS ad_activity_id, a.orderitemid AS ad_id, a.siteid AS media_id, a.inventoryid AS ad_area_id, SUM(1) AS pv FROM lxw1234.t_log a join t_config b ON (a.orderid = b.ad_activity_id) WHERE a.pt = '2015-06-15' GROUP BY a.cookieid, b.brand, a.orderid, a.orderitemid, a.siteid, a.inventoryid
再看执行计划:
这次,在一个Stage中,便完成了大表的扫描和与小表的BroadcastHashJoin,性能上自然不用说了,很快就跑完了。
在Hive中试了下同样的语句,Hive中走MapJoin,使用的时间比SparkSQL中多近50%,但需要注意的是,Hive中MapReduce消耗的资源,却是SparkSQL消耗资源的好几倍,这也证实,尽管是从HDFS中读数据,Spark仍然要优于MapReduce。
另外,SparkSQL从Hive表(HDFS)中读数据,全部用的NODE_LOCAL task,如果是ANY,那就要慢一些了,而且会消耗很大的网络资源。
本文同步自我的大数据田地(关注Hadoop、Spark、Hive等大数据技术)。
相关推荐
大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK.......
部分普通sql查询在hive中的实现方式详细说明;
Hive on Spark EXPLAIN statement : 讲述了 Common Join / Map join / Bucket Map Join / Sorted Merge Bucket Map Join / skew join 在explain 中的 树结构 。In Hive, command EXPLAIN can be used to show the ...
Spark不能使用hive自定义函数
spark-hive_2.11-2.3.0 spark-hive-thriftserver_2.11-2.3.0.jar log4j-2.15.0.jar slf4j-api-1.7.7.jar slf4j-log4j12-1.7.25.jar curator-client-2.4.0.jar curator-framework-2.4.0.jar curator-recipes-2.4.0....
hive-exec-1.2.1.spark2.jar spark2-shell 支持 hive2 hadoop3
String hql = "select id,name from (select id from table_1 where id={p0}) t1 inner join (select name --this is name\n from table_2) t2"; // 获取id字段的血缘 LineageNode idNode = Delegate.getDelegate...
项目实战:Java一站式解决Hive内用Spark取数,新建ES索引,灌入数据,并且采用ES别名机制,实现ES数据更新的无缝更新,底层采用Spark计算框架,数据较快。
6. Jline包版本不一致的问题,需要拷贝hive的lib目录中jline.2.12.jar的jar包替换掉hadoop中的 /home/hadoop/app/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar 启动hive bin/hive ---------------------...
hive-on-spark客户端
Spark SQL的DataFrame接口支持多种数据源的操作。一个DataFrame可以进行RDDs方式的操作,也可以被注册为临时表。把DataFrame注册为临时表之后,就可以对该DataFrame执行SQL查询。 Spark SQL的默认数据源为Parquet...
spark下安装hive标准配置文档。Ubuntu安装hive,并配置mysql作为元数据库时候需要的标准hive-site.xml配置文件,可以根据这个文件联系我的博文内容就行修改,避免入坑。实现快捷启动hive。
这是每个学习spark必备的jar包,是根据我的个人试验后所得,官网正版,在spark官网下载。 资源包里不仅有需要的jar包,并且给不会再官网上下载的新手官方网址,可以自由下载资源
建立Hive和Hbase的映射关系,通过Spark将Hive表中数据导入ClickHouse对应的jar包
补丁文件包,依赖包,hive3.1.2-spark3.0.0和hive3.1.3-spark3.1.3二进制包已经全部放进该压缩
spark替代Hive实现ETL作业
Hive中SQL详解
hive on spark要求spark中不包含hive的jar包,必须重新编译,历尽艰辛终于搞好了,适配hive2.3、hadoop2.7.6环境。
基于Flink+ClickHouse构建的分析平台,涉及 Flink1.9.0 、ClickHouse、Hadoop、Hbase、Kafka、Hive、Jmeter、Docker 、HDFS、MapReduce 、Zookeeper 等技术
Spark SQL 包含 3 个子项目:Core、Catalyst、Hive。其中 Catalyst 是核心的查询优化引 擎,独立于 Spark 平台;Spark SQL Core 封装 Catalyst,向应用程序提供 SparkSession、Dataset、 DataFrame 等 API...