Impala 外部表读取未压缩文件但具有名称 (*.csv.gz)

Posted

技术标签:

【中文标题】Impala 外部表读取未压缩文件但具有名称 (*.csv.gz)【英文标题】:Impala external table reading uncompressed files but with names (*.csv.gz) 【发布时间】:2021-07-18 10:19:29 【问题描述】:

我在 hdfs 中有一个数据源,其文件未压缩,即使它们的名称以 (*.csv.gz) 结尾,但 Impala 无法识别它们未压缩,尽管名称如此。有没有办法在不需要更改所有当前文件名的情况下读取外部表中的这些文件?如果没有,更改 hdfs 中所有当前文件名的最佳做法是什么?

这是当前表的创建查询:

CREATE EXTERNAL TABLE db.table1(
   col1 type,
   col2 type
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\u0001'
WITH SERDEPROPERTIES ('field.delim'='\u0001', 'serialization.format'=';')
STORED AS TEXTFILE
LOCATION 'hdfs://servicename/user/directory'

当前文件名示例(它们是 texfiles,未在内容级别压缩):

-rw-rw-r--+ /final/file11_20210601_0000.csv.gz
-rw-rw-r--+ /final/file12_20210601_0015.csv.gz
-rw-rw-r--+ /final/file12_20210601_0045.csv.gz
-rw-rw-r--+ /final/file1_20210601_0015.csv.gz

【问题讨论】:

【参考方案1】:

到目前为止,我还没有找到关于外部表属性来读取外部表中的“.gz”文件的方法,但我可以制作一个 shell 脚本来更改所有文件并从它们的末端删除“.gz”:

for f in $(hdfs dfs -ls -t -r /user/dir/ | awk 'print $8');do
  v=$(echo "$f" | cut -d'.' -f1,2)
  hdfs dfs -mv "$f" "$v"
done

但我仍然对直接在外部表中读取 .gz 文件的解决方案持开放态度。

【讨论】:

以上是关于Impala 外部表读取未压缩文件但具有名称 (*.csv.gz)的主要内容,如果未能解决你的问题,请参考以下文章

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

Impala 中的表格压缩

Impala 2.2 avro select * 查询不工作

从分区文件结构创建 Impala 外部表

使用 SparkSQL 读取 Impala 表

通过 Impala 的 Parquet 压缩类型