Hadoop Hive查询中的IN子句中的ID数量巨大

时间:2018-10-03 16:10:00

标签: java hadoop hive hdfs bigdata

Qn:什么是通过在IN子句中传递700K item_id从包含900万行的表中获取一列(例如item_name)的最佳方法。

我是Hadoop和Hive的新手,我来自Java背景。是否有任何一种/简便的方法可以一次完成所有操作?还是我需要分块?如果我需要分块,那么您建议的最佳数字是多少(我知道这取决于许多其他因素,但这只是为了获得起点)或者您会建议除蜂巢以外的任何其他解决方案(类似于Java多线程批处理命中带有大块item_ids的Hadoop)

我已经尝试通过在IN子句中发送700K,这很令人窒息,什么也没回来,查询被神秘地杀死了。

1 个答案:

答案 0 :(得分:1)

您几乎没有选择:

加入。 将所有ID放入HDFS的文件中,在文件目录顶部创建表。

CREATE EXTERNAL TABLE table_ids(item_id int)
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED IN TEXT FILE
location '/hive/data' --location(directory) in hdfs where the file is
;
select item_name from table a
      inner join table_ids b on a.item_id=b.item_id

使用in_file: 将所有ID放入文件中,连续一个ID。

select item_name from table where in_file(item_id, '/tmp/myfilename'); --local file

在内存中容纳时使用堆栈连接:

select item_name from table a
      inner join 
(
select stack(10, --the number of IDs, add more IDs
             0,  1,  2,  3,  4,  5,  6,  7,  8,  9) as (item_id) 
 ) b
 on a.item_id=b.item_id