Spark 分区 Parquet 文件生成 Impala 表

3
我已经使用Spark生成了一些分区parquet数据,现在想知道如何将其映射到Impala表中...不幸的是,我还没有找到任何解决方案。 parquet的模式如下:
{ 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创建一个外部表,然后使用Spark的hiveContext将数据插入该表中,最后在Impala中运行REFRESH命令以确认新的数据文件吗? - Samson Scharfrichter
顺便问一下,你确定你的分区是否有意义 - 你的Parquet文件有多大?而且date列可能会带来麻烦,因为它是SQL中的保留字...! - Samson Scharfrichter
1个回答

3
假设您所说的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个命令将根据表的模式自动检测分区,并了解子目录中存在的parquet文件。

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

希望这有所帮助。


哦,谢谢你提供“恢复分区”的提示。Cloudera的文档中说:“RECOVER PARTITIONS子句会自动识别这些新目录中存在的任何数据文件,就像REFRESH语句一样。”但在我的情况下,这完全是个谎言……刷新表并不能扫描,只有恢复分区才能。+1 - Markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接