Hadoop Hive 查询中 IN 子句中的大量 Id

Posted

技术标签:

【中文标题】Hadoop Hive 查询中 IN 子句中的大量 Id【英文标题】:Huge Number of Ids in IN clause in Hadoop Hive query 【发布时间】:2018-10-03 16:09:59 【问题描述】:

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

我对 Hadoop 和 Hive 非常陌生,我来自 Java 背景。无论如何/简单的方法可以一次完成所有操作?还是我需要分块?如果我需要分块,您建议的最佳数字是多少(我知道这取决于许多其他因素,但只是为了获得一个起点)或者您会建议除 hive 之外的任何其他解决方案(类似于 Java 多线程批处理具有大量 item_id 的 Hadoop)

我已经尝试通过在IN 子句中发送 700K,它令人窒息,没有返回,查询被神秘地杀死了。

【问题讨论】:

加入吧?将 700K 加载到临时表中,并将临时表与 item_name 的表连接起来。 【参考方案1】:

你有几个选择:

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

CREATE EXTERNAL TABLE table_ids(item_id int)
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
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

【讨论】:

谢谢。让我试试

以上是关于Hadoop Hive 查询中 IN 子句中的大量 Id的主要内容,如果未能解决你的问题,请参考以下文章