如何将原始数据插入具有不同列序列的配置单元表中?
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 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
文件中,请注意列顺序更改。
我很难找到正确的信息,谁能解释如何处理这种情况的最佳实践?如果是小文件,我们可以使用脚本来更正文本,但如果它是批量的,并且每次文本文件都有不同的排列,怎么办?感谢任何答案/反馈。
【问题讨论】:
【参考方案1】:通过更改列顺序和/或添加/删除列,一种选择是在将文件加载到 Hive 表之前将文本文件转换为 Parquet
格式。将属性 hive.parquet.use-column-names = true
设置为 false
通过默认情况下,按列名而不是按列索引读取 Parquet 文件。(这样可以消除对源文件中列顺序的依赖)分区可以有不同的模式,您可以创建一个包含所需整体列的表。
请注意,与托管表相比,external table
更易于维护,无需在架构更改时移动数据。当架构更改时,您可以删除并重新创建表并执行msck repair table ..
以读取数据。
要检测架构更改,您可以运行一个进程来检查文本文件的第一行(假设它们是列名)是否有任何更改。此过程的输出可以写入具有适当架构版本控制的 MongoDB/DynamoDB 数据存储等持久存储。这有助于保留所有架构更改的历史记录。
【讨论】:
以上是关于如何将原始数据插入具有不同列序列的配置单元表中?的主要内容,如果未能解决你的问题,请参考以下文章