Огромное количество идентификаторов в предложении IN в запросе Hadoop Hive - PullRequest
0 голосов
/ 03 октября 2018

Qn: Какой лучший способ получить один столбец (скажем, item_name) из таблицы, содержащей 9 миллионов строк, путем передачи 700K item_ids в предложении IN

ЯЯ новичок в Hadoop и Hive. Я пришел из Java.Есть ли в любом случае / легкий способ получить все это за один раз?Или мне нужно разбить его на куски?Если мне нужно разделить на части, какое число вы предложите (я знаю, что это зависит от множества других факторов, но только для того, чтобы получить отправную точку) Или вы предложите какое-либо иное решение, кроме hive (Что-то вроде многопоточного выполнения Java-пакетовHadoop с кусками item_ids)

Я уже пытался отправить 700K в предложении IN, он задыхается, ничего не возвращается, запрос был загадочным образом убит.

1 Ответ

0 голосов
/ 03 октября 2018

У вас есть несколько вариантов:

Присоединиться. Поместить все идентификаторы в файл в 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: Поместить все идентификаторы в файл, один идентификатор в строке.

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
...