慢hive查询,为什么(左半连接)?

时间:2013-07-11 14:26:09

标签: hadoop hive hiveql

我的hive查询挂起,我不知道为什么(使用hadoop 0.20.1,hive 0.9)。

查询:

SELECT 
   a.field1 FROM table_1 a 
LEFT SEMI JOIN 
   (SELECT DISTINCT(usrId) FROM table_2 b 
       WHERE soemthing=true ORDER BY rand() limit 1000) random_user_ids 
WHERE a.usrId=random_user_ids.usrId

EXPLAIN让我回来了:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1
  Stage-3 depends on stages: Stage-2
  Stage-0 is a root stage

数据集

    表中
  • ~200M条目
  • table_1.usrId与table_1的关系应约为1:40,即上述查询中应返回1000 * 40 = 40000

观察:

  • 工作在最后阶段3挂起33%(减少>排序),正在进行加入(加入结果约为40000)
  • 除了慢,为什么减少>对Stage-3的一部分进行排序?它应该只加入东西而不是ORDER任何东西
  • reducer size只有1(因为排序?),几乎总是坏的,因为它不能缩放。

如果您需要更多输入(例如更详细的EXPLAIN信息,更多群集信息),请告诉。

谢谢!

1 个答案:

答案 0 :(得分:2)

JOIN条件应包含在 ON 子句中,而不应包含在WHERE子句中。

语法示例:

SELECT a.key, a.val
FROM a LEFT SEMI JOIN b ON (a.key = b.key)