Hive 将多个分区的 HDFS 文件加载到表

如何解决Hive 将多个分区的 HDFS 文件加载到表

我在 HDFS 中有一些两次分区的文件,其结构如下:

/user/hive/warehouse/datascience.db/simulations/datekey=20210506/coeff=0.5/data.parquet
/user/hive/warehouse/datascience.db/simulations/datekey=20210506/coeff=0.75/data.parquet
/user/hive/warehouse/datascience.db/simulations/datekey=20210506/coeff=1.0/data.parquet
/user/hive/warehouse/datascience.db/simulations/datekey=20210507/coeff=0.5/data.parquet
/user/hive/warehouse/datascience.db/simulations/datekey=20210507/coeff=0.75/data.parquet
/user/hive/warehouse/datascience.db/simulations/datekey=20210507/coeff=1.0/data.parquet

并希望尽可能优雅地将这些加载到配置单元表中。我知道这种情况的典型解决方案是首先将所有数据加载到非分区表中,然后使用如上所述的动态分区将所有数据传输到最终表here

然而,我的文件在实际数据中没有 datekey 和 coeff 值,它只在文件名中,因为它是如何分区的。那么,当我将这些值加载到中间表中时,我将如何跟踪这些值?

一种解决方法是对每个 coeff 值和 datekey 执行单独的 load data inpath 查询。这不需要中间表,但会很麻烦并且可能不是最佳的。

有没有更好的方法来做到这一点?

解决方法

典型的解决方案是在 hdfs 目录之上构建外部分区表:

create external table table_name (
column1 datatype,column2 datatype,...
columnN datatype 
)
partitioned by (datekey int,coeff float)
STORED AS PARQUET
LOCATION '/user/hive/warehouse/datascience.db/simulations'

之后,恢复所有分区,此命令将扫描表位置并在 Hive 元数据中创建分区:

MSCK REPAIR TABLE table_name;

现在您可以查询表列和分区列,并使用它做任何您想做的事情:按原样使用,或使用 insert .. select .. 等加载到另一个表中:

select 
    column1,column2,...
    columnN,--partition columns
    datekey,coeff
from table_name
where datekey = 20210506
; 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?