【问题标题】:Impala table from spark partitioned parquet filesSpark分区镶木地板文件中的Impala表
【发布时间】:2017-11-11 13:01:53
【问题描述】:

我使用 Spark 生成了一些分区 parquet 数据,我想知道如何将其映射到 Impala 表...遗憾的是,我还没有找到任何解决方案。

拼花的架构是这样的:

{ key: long,
value: string,
date: long }

我用keydate 对它进行了分区,这样我的hdfs 上就有了这种目录:

/data/key=1/date=20170101/files.parquet
/data/key=1/date=20170102/files.parquet
/data/key=2/date=20170101/files.parquet
/data/key=2/date=20170102/files.parquet
...

你知道我如何告诉 Impala 从这个数据集创建一个带有相应分区的表(并且不必像我读过的那样在每个分区上循环)吗?有可能吗?

提前谢谢你

【问题讨论】:

  • 您是否尝试过改变视角,即使用 Impala 创建一个 EXTERNAL 表,然后使用 Spark hiveContext 插入该表,然后只需在 Impala 中运行 REFRESH 以确认新数据文件?
  • 顺便说一句,您确定您的分区有意义吗?您的 Parquet 文件有多大?而date 列只会带来麻烦,因为它是 SQL 中的保留字......!

标签: apache-spark parquet impala partition


【解决方案1】:

假设 parquet 的模式,您的意思是数据集的模式,然后使用列进行分区,您将在实际的 files.parquet 文件中只有键列。现在可以进行如下操作了

解决方案是使用 impala 外部表。

create external table mytable (key BIGINT) partitioned by (value String ,
date BIGINT) stored as parquet location '....../data/'

请注意,在上面的语句中,您必须给出数据文件夹的路径

alter table mytable recover partitions'

refresh mytable;

以上2条命令会根据表的schema自动检测分区,并了解子目录中存在的parquet文件。

现在,您可以开始查询数据了。

希望对你有帮助

【讨论】:

  • 天哪,感谢recover partitions 的提示。 Cloudera 的文档声明 “RECOVER PARTITIONS 子句自动识别这些新目录中存在的任何数据文件,与 REFRESH 语句一样。”在我的情况下完全是谎言...刷新表不会扫描恢复分区。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 2018-12-23
  • 2018-10-27
  • 1970-01-01
  • 2019-06-02
  • 2019-11-20
相关资源
最近更新 更多