是否有可能将不同的 csv 文件匹配到一个配置单元中 table?

Is there a possiblilty to match different csv files into one hive table?

我有 53 个 csv 文件,每个文件都有不同的列名和内容。我想将 csv 文件中的所有数据写入包含所有必要列的 Hive 中的一个大 table。因此,某些文件的列可能会留空。这取决于 csv 文件。不幸的是我不知道如何处理这个问题。

是否可以将 csv 文件中的列名与 Hive table 匹配?我只在 csv 中找到具有非动态列的解决方案。

我是否必须为每个文件设置一个 table 然后再加入它们?

谢谢!

Do I have to set up a table for each file and join them afterwards?

是的,为每个文件设置一个 table 并将文件放在每个 table 位置。

一些table可以合并。例如,如果您在一个 CSV 文件中有 col2, col2, col3,在第二个 CSV 文件中有 col1, col2, col3, col4, col5(公共列在相同位置,额外列在末尾),那么您可以创建单个 table对于列的超集,第一个文件中不存在的列将被 select 编辑为 NULL 而不是第二个文件中的 NULL,将两个文件放入相同的 table 位置。

您还可以将不同的文件(相同列的位置不同)组合到单个 table 位置(table 应该有与最宽文件中一样多的字符串列),然后在 select 你可以使用 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

创建所有 table 后,您可以根据需要加入它们或 UNION ALL + 聚合。

更好的解决方案是在这种情况下使用 JSON 而不是 CSV:

  • JSON包含名字,位置无关紧要
  • JSON 允许缺少属性
  • 如果某些属性不在 JSON 记录中,则返回 NULL 作为该记录的列值
  • 您可以将 JSON 个不同内容的文件放在同一位置,并创建一个 table 具有列的超集,请参阅如何创建 table , and