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的主要内容,如果未能解决你的问题,请参考以下文章

当查询具有 GROUP BY 子句时,Hive 查询抛出“来自 org.apache.hadoop.hive.ql.exec.tez.TezTask 的代码 2”异常

使用 NOT IN 子句替代 Hive 查询

Hive总结Hive查询进阶

如何在 on 子句中使用自定义 udf 时模仿 hive 中的“not in”操作?

hive UNION和子查询

Impala 或 Hive 在其他 SQL 语法中是不是有类似 IN 子句的东西?