从带有子目录的 HDFS 目录创建 Impala 表

Posted

技术标签:

【中文标题】从带有子目录的 HDFS 目录创建 Impala 表【英文标题】:Create Impala Table from HDFS Directory with subdirectories 【发布时间】:2020-06-16 02:49:35 【问题描述】:

我有一个目录,比如/user/name/folder

在这个目录里面,我还有多个子目录,分别命名为dt=2020-06-01dt=2020-06-02dt=2020-06-03

这些目录包含 parquet 文件。它们都具有相同的架构。

是否可以使用/user/name/folder 创建 Impala 表?

每次我这样做,我都会得到一个包含 0 条记录的表。有没有办法告诉 Impala 从所有子目录中提取 parquet 文件?

【问题讨论】:

【参考方案1】:

一种方法是使用静态分区加载数据,您可以在其中手动定义不同的分区。使用静态分区,您可以使用 ALTER TABLE ... ADD PARTITION 语句手动创建分区, 然后将数据加载到分区中。

CREATE TABLE customers_by_date 
        (cust_id STRING, name STRING) 
PARTITIONED BY (dt STRING)
STORED AS PARQUET;

ALTER TABLE customers_by_country 
ADD PARTITION (dt='2020-06-01') 
SET LOCATION '/user/name/folder/dt=2020-06-01';

如果未指定位置,则创建位置

ALTER TABLE customers_by_date
ADD PARTITION (dt='2020-06-01');

您也可以使用 HDFS 命令加载数据

$ hdfs dfs -cp /user/name/folder/dt=2020-06-01 /user/directory_impala/table/partition

您可以点击这些指向 Cloudera 文档的链接了解更多详细信息:

Partitioning for Impala Tables

Impala Create table statement

Impala Alter table statement

【讨论】:

以上是关于从带有子目录的 HDFS 目录创建 Impala 表的主要内容,如果未能解决你的问题,请参考以下文章

客快物流大数据项目(七十五):使用impala创建kudu表

带有制表符分隔值和字段名称的 Impala 外部表

如何对 hdfs 中的数据进行加密,然后创建 hive 或 impala 表进行查询?

Cloudera Impala:它如何从 HDFS 块中读取数据?

使用java从本地主机创建远程hdfs目录

impala 数据存储分配在哪里?