Объединяйте таблицы с разными столбцами, используя Hive SQL - PullRequest
0 голосов
/ 16 ноября 2018

Я использую кластер AWS для обработки многих файлов JSON с вложенными данными в сведенные таблицы Hive.

Некоторые наборы данных очень большие, поэтому мне нужно разбить их на куски и создать отдельную маленькую таблицу Hive для каждого чанка, что приводит к тому, что у этих меньших таблиц разные столбцы.Например, table1 имеет столбцы A1....A1000, table2 имеет столбцы A1,A3,A100,...A1000 и A1001 (поэтому некоторые столбцы являются общими, некоторые уникальны для каждой таблицы).

Есть ли способ добавить, объединить или объединить эти небольшие таблицы (может быть сотни таблиц, по ~ 1e7 строк в каждой) в одну большую таблицу Hive, в которой есть все столбцы из небольших таблиц (и NULL)в пропущенных ячейках для каждой маленькой таблицы, в которой изначально не было этого конкретного столбца)?Например, Total_table со столбцами A1...A1001?

UPD: команда printSchema () будет отображать что-то вроде этого:

root
 |-- aaa: struct (nullable = true)
 |    |-- ids: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- bb1: string (nullable = true)
 |    |    |    |-- bb2: string (nullable = true)
 |    |    |    |-- bb3: string (nullable = true)

Когда я выравниваю это, чтобы получить обычную таблицу Hive, в зависимости отнабор json-файлов, которые оказались в каждом чанке, количество элементов в массиве ids (например) может быть разным, и поэтому выходные столбцы также будут разными: как aaa_ids_bbb1_0 (для 0-го элемента массива ids) ,..., aaa_ids_bbb1_999 (для 999-го элемента, если там 1000 элементов).Таким образом, таблицы в каждом чанке могут быть разными.

В модуле Python для модулей, если я объединю 3 кадра данных со столбцами A, B, C (1-й), A, C, D (2-й) и D, E,F (3-е), результирующий кадр данных будет иметь столбцы A, B, C, D, E, F.Мне нужно сделать то же самое, но в Hive SQL, если это возможно, конечно.

1 Ответ

0 голосов
/ 19 ноября 2018

1) Если ваши таблицы основаны на JSONSerDe, вы можете заново создать таблицы с такой же структурой, отсутствующие элементы будут нулевыми.

Простой UNION ALL:

select col1,  from table 
UNION ALL 
    select * from table 2 
    ...

в этом случае будет работать нормально.Гораздо лучше поместить все файлы в одну и ту же папку, это будет работать без UNION.

2) Если невозможно применить первый (предпочтительный) вариант, тогда вам нужно перечислить все столбцы в каждой таблице, указав пустые значениядля отсутствующих столбцов:

select A1, ... A1000, null A1001, null A1002  from table 
UNION ALL 
select A1, ... A1000, A1001, null A1002 from table 2 
UNION ALL 
...
...