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

Hive 如何将原始数据插入到具有不同列序列的配置单元表中?,hive,bigdata,hiveql,devops,data-warehouse,Hive,Bigdata,Hiveql,Devops,Data Warehouse,给定:Hive 2.3.0版以后,我有一个Hive表和一个固定的DDL,这是很久以前的事了。现在,原始数据以不同的列顺序以文本文件的形式出现,并且必须使用固定的分区标准以拼花格式存储数据。我的问题是,当传入的数据具有不同的列排列时,如何处理这种情况 例如: CREATE TABLE users ( col1 string, col2 int, col3 string ... ) PARTITIONED BY (...) STORED AS PARQUET; 传入数据的排列方式如下

给定:Hive 2.3.0版以后,我有一个Hive表和一个固定的DDL,这是很久以前的事了。现在,原始数据以不同的列顺序以文本文件的形式出现,并且必须使用固定的分区标准以拼花格式存储数据。我的问题是,当传入的数据具有不同的列排列时,如何处理这种情况

例如:

CREATE TABLE users ( col1 string, col2 int, col3 string ... )
PARTITIONED BY (...)
STORED AS PARQUET; 
传入数据的排列方式如下

      col1 col3 col2
(row)  x    p    1
       y    q    2
在文本文件中,请注意列顺序的更改


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

通过更改列顺序和/或添加/删除列,一个选项是在将文件加载到配置单元表之前将文本文件转换为拼花格式。设置属性Hive.Parquet.use-column-names=true,默认为false,按列名而不是按列索引读取拼花地板文件。通过这种方式,可以消除源文件分区中对列顺序的依赖,可以使用不同的架构,并且可以创建具有所需整体列的表

请注意,与托管表相比,外部表更易于维护,在模式更改时无需移动数据。当模式更改时,您可以删除并重新创建表,并执行msck修复表。。读取数据

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