首页 > 解决方案 > 是否有可能将不同的 csv 文件匹配到一个配置单元表中?

问题描述

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

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

我是否必须为每个文件设置一个表格并在之后加入它们?

谢谢!

标签: csvhivecreate-tablehiveddl

解决方案


我是否必须为每个文件设置一个表格并在之后加入它们?

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

有些表可以合并。例如,如果您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 文件放入同一位置并创建一个包含列超集的表,请参阅如何创建表answer 1answer 2answer 3

推荐阅读