在Hive中,我有一个大表B
(约3亿行)和一个相对较小的表A
。我只是想做
SELECT A.*, B.* FROM A LEFT JOIN B ON A.a_id = B.b_id
但查询停留在地图的50%,并且无法继续进行。我也尝试在PySpark中执行相同的操作,但基本上得到了相同的结果。 a_id
和b_id
都是字符串,分别是A
和B
的唯一键。为了执行联接,我不必选择A.*
和B.*
,而只需要选择我当前分析中绝对需要的列。即使现在可以完成此加入,但是任何人都可以请我更深入地了解我为什么会遇到这个问题吗?仅仅是表的大小对于工作者内存而言太大了吗?
答案 0 :(得分:0)
由于您使用的是select *
,因此将扫描所有表数据。同样,一个表的记录更少,因此没有分配适当的资源,因此由于资源的不可用而被卡住了。
启用映射联接和增加堆内存应有助于解决此问题。您可以通过在查询之前设置以下属性来启用这些功能。
set mapreduce.map.java.opts=-Xmx7200m;
set hive.auto.convert.join = true;