Заполните столбцы запроса Hive SQL результатами другого запроса - PullRequest
1 голос
/ 28 января 2020

Apache Hive (версия 1.2.1000.2.6.5.0-292)

У меня есть таблица A с большим количеством столбцов. Я пытаюсь выбрать только те столбцы, которые мне нужны, из столбцов A и столбцы, которые я хочу разместить в таблице пар ключ-значение B. (Пример ниже). Я могу запросить B, чтобы получить нужные мне столбцы, но я изо всех сил пытаюсь поместить выходные данные этого sql запроса в качестве столбцов запроса, используемого в A. Есть ли способ сделать это в одном sql запросе? Я могу написать программу python, чтобы сделать это для создания SQL, но я бы предпочел, чтобы это был всего один запрос для простоты для конечного пользователя.

DDL для таблиц

create table A (
a1 string,
a2 string,
a3 string,
b1 string,
b2 string,
b3 string,
)

create table B (
key string,
value string,
)

Данные в таблице B (таблица ключевых значений). Следует отметить, что данные в столбце value не могут быть выведены соответствующим значением в столбце key. Я написал их как a1,a2 для простоты.

key,value
a,a1
a,a2
a,a3
b,b1
b,b2
b,b3

Запрос на получение правильных столбцов = select value from B where key='a'

Когда вы объединяете результаты этого запроса с запросом таблицы A, вы должен получить это sql выражение

select a1,a2,a3 from A

Как видите, мы пытаемся получить столбцы, используемые в таблице A

Моя первая попытка не работает:

select 
(select value from B where key='a')
from A

Как правильно это сделать?

Заранее спасибо!

1 Ответ

0 голосов
/ 29 января 2020

Вы можете попытаться сгенерировать запрос и записать в файл. После этого вы можете вызвать существующий hive hive с помощью команды источника:

Вот примеры запросов на вашем примере:

Создать таблицу и фиктивные данные:

CREATE EXTERNAL TABLE IF NOT EXISTS a_table(
a1 string,
a2 string,
a3 string,
b1 string,
b2 string,
b3 string)
LOCATION '/user/xyz/a_table';

insert into table a_table
 VALUES ('a11', 'a12', 'a13','b11','b12','b13'), ('a21', 'a22', 'a23','b21','b22','b23');


CREATE EXTERNAL TABLE IF NOT EXISTS b_table (
key string,
value string
)
LOCATION '/user/xyz/b_table';

insert into table b_table
 VALUES ('a', 'a1'), ('a','a2'),('a','a3'), ('b', 'b1'), ('b','b2'),('b','b3');

Проверьте данные в таблицу:

select * from a_table;
OK
a11     a12     a13     b11     b12     b13
a21     a22     a23     b21     b22     b23
Time taken: 0.124 seconds, Fetched: 2 row(s)


select * from b_table;
OK
a       a1
a       a2
a       a3
b       b1
b       b2
b       b3
Time taken: 0.15 seconds, Fetched: 6 row(s)

Это часть hive hql для генерации оператора на основе заданного ключа и последующего использования source для выполнения запроса:

insert overwrite local directory '/home/xyz/temp_hql/out'
select concat_ws(" ", "select",concat_ws("," , collect_list(value)), "from a_table") 
from b_table where key = 'a';

source /home/xyz/temp_hql/out/000000_0;
OK
a11     a12     a13
a21     a22     a23

insert overwrite local directory '/home/xyz/temp_hql/out' 
select concat_ws(" ", "select",concat_ws("," , collect_list(value)), "from a_table") 
from b_table where key = 'b';

source /home/xyz/temp_hql/out/000000_0;
OK
b11     b12     b13
b21     b22     b23
...