Есть ли возможность сопоставить разные CSV-файлы в одной таблице улья?

У меня есть 53 файла CSV, каждый с разными именами столбцов и содержимым. Я хочу записать все данные в CSV-файле в одну большую таблицу в Hive, содержащую все необходимые столбцы. Таким образом, может случиться так, что столбцы для некоторых файлов останутся пустыми. Это зависит от файла csv. К сожалению, я не знаю, как решить эту проблему.

Есть ли возможность сопоставить имена столбцов из файлов csv с таблицей Hive? Я нашел только решения с нединамическими столбцами в csv.

Нужно ли мне создавать таблицу для каждого файла и потом присоединяться к ним?

Спасибо!


person Nicko    schedule 28.07.2021    source источник


Ответы (1)


Нужно ли мне создавать таблицу для каждого файла и потом присоединяться к ним?

Да, настройте таблицу для каждого файла и поместите файл в каждое место таблицы.

Некоторые таблицы можно комбинировать. Например, если у вас есть col2, col2, col3 в одном файле CSV и col1, col2, col3, col4, col5 во втором файле CSV (общие столбцы находятся в тех же позициях, а дополнительные столбцы в конце), вы можете создать одну таблицу с надмножеством столбцов, столбцы, отсутствующие в первом файле, будут выбрано как NULL, а не как NULL из второго файла, поместите оба файла в одну и ту же папку.

Также вы можете объединить разные файлы (одинаковые столбцы, расположенные по-разному) в одном месте таблицы (таблица должна иметь столько же строковых столбцов, сколько в самом широком файле), затем в выборе вы можете использовать псевдостолбец INPUT__FILE__NAME, проанализировать имя файла и вычислить столбцы в зависимости от это, например, примерно так:

select 
case when INPUT__FILE__NAME rlike 'invoice\\.csv' then col1 
     when INPUT__FILE__NAME rlike 'transaction\\.csv' then col3
     else NULL
 end as invoice_nbr

После того, как вы создали все таблицы, вы можете объединить их или объединить UNION ALL + в зависимости от требований.

В этом случае гораздо лучшим решением будет использовать JSON вместо CSV:

  • JSON содержит имена, положение не имеет значения
  • JSON допускает отсутствие атрибутов
  • Если какой-либо атрибут отсутствует в записи JSON, в качестве значения столбца для этой записи возвращается NULL.
  • вы можете поместить файлы JSON с разным содержанием в одно и то же место и создать таблицу с надмножеством столбцов, см., как создать таблицу ответ 1, ответ 2 и ответ 3
person leftjoin    schedule 28.07.2021
comment
Спасибо @leftjoin. Возможно, я попробую другой способ, например Apache NiFi, для решения этой проблемы, потому что я не могу с уверенностью сказать, что каждый файл имеет одинаковую структуру каждый день, потому что его содержимое меняется ежедневно. - person Nicko; 28.07.2021
comment
@Nicko В таком случае JSON - намного лучший формат (используйте JSONSerDe), потому что вы можете определить таблицу с надмножеством возможных столбцов и поместить все файлы JSON в ее местоположение, и если столбец отсутствует в записи JSON, он будет NULL. Это идеально соответствует вашему сценарию. JSON допускает отсутствие атрибутов. Вы можете разместить разные файлы JSON в одном месте таблицы. У JSON есть имена внутри, и привязка не позиционная, как в CSV - person leftjoin; 28.07.2021
comment
Я ценю вашу готовность помочь. У меня это работает! - person Nicko; 29.07.2021
comment
@Nicko Добавил в ответ, надеюсь, будет полезно. - person leftjoin; 30.07.2021