как изменить схему таблицы улья в соответствии с формой csv

как изменить схему таблицы улья в соответствии с формой CSV

Hive [развернут в Azure HDInsight]
CSV-файлы данных [в хранилище BLOB-объектов Azure]

Мое требование:

Например. У меня есть CSV с 3 столбцами A B C
и еще один CSV с 3 столбцами A B D
Есть ли способ создать таблицы Hive в соответствии с формой CSV?

Что я пробовал:

Я создаю таблицу в улье с A B C D
и Loaded file1 (A B C)
ожидаемым как A B C D - x x x null
file2 (A B D)
ожидаемым как A B C D - x x null x

Но

file2 (A B D)
фактические результаты A B C D - x x x null

Любой совет будет сердечно оценен.

заранее спасибо


person Harish Kowrada    schedule 18.02.2021    source источник


Ответы (1)


Нет, в одной таблице это невозможно, это можно решить следующими способами:

1 Две таблицы + представление Создайте две таблицы: T1 (A, B, C) и T2 (A, B, D) и представьте

select A,B,C, null as D 
  from table1
UNION ALL
select A, B, null as C, D
  from table2

2 Создайте единую таблицу со столбцами A, B, C и представление с логикой, основанной на file_name (псевдокод, проверьте, что действительно возвращает INPUT__FILE__NAME, и исправьте соответственно)

select A, B, 
       case when INPUT__FILE__NAME == 'file1' then C else null  end  as C,
       case when INPUT__FILE__NAME == 'file2' then C else null  end  as D

Но это представление не будет работать в других инструментах, таких как Presto, поэтому первый вариант лучше.

person leftjoin    schedule 18.02.2021
comment
У меня возникает проблема с разрешением на ошибку: для Table1 я использовал это: CREATE EXTERNAL TABLE IF NOT EXISTS datalog.t1 (A string, B string, C string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION 'CONTAINERNAME /' TBLPROPERTIES (skip.header.line.count = 1); выполнено успешно, с использованием hdfs dfs -mkdir CONTAINERNAME / testing1 выполнено успешно - person Harish Kowrada; 19.02.2021
comment
но я не могу создать другую таблицу, указывающую на вновь созданную папку: СОЗДАТЬ ВНЕШНЮЮ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ datalog.t2 (строка A, строка B, строка D) ФОРМАТ СТРОКИ, РАЗДЕЛЕННЫЕ ПОЛЯ, ЗАКОНЧЕННЫЕ НА ',' СОХРАНЕНО КАК МЕСТО ТЕКСТФАЙЛА 'CONTAINERNAME / testing1 /' TBLPROPERTIES (skip.header.line.count = 1); - person Harish Kowrada; 19.02.2021
comment
ОШИБКА: СБОЙ: ошибка выполнения, код возврата 1 из org.apache.hadoop.hive.ql.exec.DDLTask. MetaException (сообщение: java.security.AccessControlException: Permission denied: user = hive, path = wasb: // CONTAINERNAME @ CLUSTERNAME / user / hive / CONTAINERNAME / testing1: root: supergroup: drwxr-xr-x) INFO: Completed running command (queryId = hive_20210219110305_c431229f-1aa5-4d2b-8134-b074c76954e4); Затраченное время: 0,388 секунды - person Harish Kowrada; 19.02.2021
comment
Ошибка: ошибка при обработке оператора: FAILED: ошибка выполнения, код возврата 1 из org.apache.hadoop.hive.ql.exec.DDLTask. MetaException (сообщение: java.security.AccessControlException: Permission denied: user = hive, path = wasb: // CONTAINERNAME @ CLUSTERNAME / user / hive / CONTAINERNAME / testing1: root: supergroup: drwxr-xr-x) (state = 08S01, код = 1) - person Harish Kowrada; 19.02.2021
comment
Не могли бы вы сообщить мне, что здесь не так? пожалуйста - person Harish Kowrada; 19.02.2021
comment
Создайте таблицу без указанной папки, и она должна создать папку с именем таблицы, затем поместить файл в папку для каждой таблицы - person leftjoin; 19.02.2021
comment
Большое вам спасибо за ваш быстрый ответ. t1t2_vw.a | t1t2_vw.b | t1t2_vw.c | t1t2_vw.d | + ------------ + ------------ + ------------ + ---------- - + | A1 | B1 | C1 | NULL | | A2 | B2 | C2 | NULL | | A1 | B1 | NULL | D1 | | A2 | B2 | NULL | D2 - person Harish Kowrada; 19.02.2021