问题描述
我有 53 个 csv 文件,每个文件都有不同的列名和内容。我想将 csv 文件中的所有数据写入 Hive 中包含所有必要列的一个大表中。因此,某些文件的列可能会留空。这取决于 csv 文件。不幸的是,我不知道如何处理这个问题。
是否可以将 csv 文件中的列名匹配到 Hive 表?我只在 csv 中找到了非动态列的解决方案。
谢谢!
解决方法
我是否必须为每个文件设置一个表然后加入它们?
是的,为每个文件设置一个表并将文件放在每个表位置。
有些表可以合并。例如,如果您在一个 CSV 文件中有 col2,col2,col3
,在第二个 CSV 文件中有 col1,col3,col4,col5
(公共列在相同的位置,最后有额外的列),那么您可以创建具有列超集的单个表,第一个文件中不存在的列将被选为 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: