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

Posted

技术标签:

【中文标题】如何将原始数据插入具有不同列序列的配置单元表中?【英文标题】:How to insert raw data into hive table having different column sequence? 【发布时间】:2020-01-13 18:36:42 【问题描述】:

鉴于:Hive Version 2.3.0 onwards,我有一个 Hive 表和一个固定的 DDL 很长时间以来。现在raw datatext 文件以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 文件中,请注意列顺序更改。

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何将原始数据插入具有不同列序列的配置单元表中?的主要内容,如果未能解决你的问题,请参考以下文章

Excel如何将原始数据表中的数据分类同步到新的工作表中?

在具有红色填充的列中将公式插入每个单元格[关闭]

将不同单元格中具有两个日期的数据集转换为系列或序列(Google 工作表)

将火花数据框附加到具有不同列顺序的配置单元表

使用序列设置主 ID 时如何将数据批量插入表中

从具有多个分区列的配置单元表中获取最新数据