如何将原始数据插入到具有不同列序列的配置单元 table 中?

How to insert raw data into hive table having different column sequence?

鉴于:Hive Version 2.3.0 onwards,我有一个 Hive table 和一个固定的 DDL 从很长一段时间。现在 raw data 以与 text 文件不同的 columns 顺序出现,并且必须以具有固定分区标准的 parquet 格式存储数据。我的问题是当传入数据有 different arrangement of columns.

时如何处理这种情况

示例:

CREATE TABLE users ( col1 string, col2 int, col3 string ... )
PARTITIONED BY (...)
STORED AS PARQUET; 

传入数据的排列类似于

      col1 col3 col2
(row)  x    p    1
       y    q    2

text 文件中,注意列顺序更改。

我很难找到正确的信息,谁能解释一下如何处理这种情况的最佳做法?如果它是小文件,我们可以使用脚本来更正文本,但如果它是大文件并且每次文本文件都有不同的排列,该怎么办?感谢任何答案/反馈。

通过更改列的列顺序 and/or addition/deletion,一种选择是在将文件加载到 Hive table.Set 之前将文本文件转换为 Parquet 格式属性 hive.parquet.use-column-names = true 默认情况下是 false,按列名而不是按列索引读取 Parquet 文件。(这样可以消除对源文件中列顺序的依赖)分区可以有不同的模式,你可以创建一个 table 与所需的整体列。

请注意,与托管 table 相比,external table 更易于维护,而无需在架构更改时四处移动数据。当架构更改时,您可以删除并重新创建 table 并执行 msck repair table .. 来读取数据。

要检测模式更改,您可以有一个进程 运行 检查文本文件的第一行(假设它们是列名)是否有任何更改。此过程的输出可以写入持久存储,例如具有适当模式的 MongoDB/DynamoDB 数据存储 versioning.This 有助于保留所有模式更改的历史记录。