在Azure HDInsights中从分区的Parquet文件创建Hive外部表

14

我在Azure Blob存储中保存了作为Parquet文件的数据,按年、月、日和小时进行了分区,如下所示:

cont/data/year=2017/month=02/day=01/

我想使用以下创建语句在Hive中创建外部表,我是使用此参考文档编写的。

CREATE EXTERNAL TABLE table_name (uid string, title string, value string) 
PARTITIONED BY (year int, month int, day int) STORED AS PARQUET 
LOCATION 'wasb://cont@storage_name.blob.core.windows.net/data';

在查询时,这会创建一个表,但没有行。我尝试了同样的创建语句,但没有使用PARTITIONED BY子句,那似乎可以工作。所以看起来问题出在分区上。

我错过了什么?

1个回答

21
创建分区表后,运行以下命令以将目录添加为分区。
MSCK REPAIR TABLE table_name;

如果您有大量分区,则可能需要设置 hive.msck.repair.batch.size
当存在大量未跟踪的分区时,可以通过批处理运行 MSCK REPAIR TABLE 以避免 OOME(内存不足错误)。通过为属性 hive.msck.repair.batch.size 配置批处理大小,它可以在内部批处理运行。该属性的默认值为零,这意味着它将一次执行所有分区。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-RecoverPartitions(MSCKREPAIRTABLE)

由原帖作者撰写:

这可能会解决你的问题,但是如果数据非常大,它将无法工作。在此处查看相关问题here

作为一种解决方法,还有另一种逐个添加Hive Metastore分区的方法,如下所示:

alter table table_name add partition(year=2016, month=10, day=11, hour=11)

我们编写了一个简单的脚本来自动化这个alter语句,目前似乎可以工作。


1
谢谢回答。我刚在文档中找到了那个语句。然而,当我运行它时,我遇到了这个错误:FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask。所以看起来有其他问题。 - chhantyal
@chhantyal 这可能是由于元存储架构验证引起的,请参考 https://cwiki.apache.org/confluence/display/Hive/Hive+Schema+Tool#HiveSchemaTool-MetastoreSchemaVerification 检查 hive-site.xml 中属性 hive.metastore.schema.verification 是否为 true。或者这可能是由于SQL Azure锁定或拒绝某些操作引起的。 - Peter Pan
@chhantyal - 信息不足。请检查日志或在 DEBUG 模式下运行。 - David דודו Markovitz
尝试将日志级别更改为DEBUG。 - David דודו Markovitz
你尝试过设置hive.msck.repair.batch.size吗? - David דודו Markovitz
设置 hive.msck.repair.batch.size 只在 Hive 的新版本(2.2.0)中可用,但 HDInsight 目前还不支持该版本。即使是在新版本中,似乎仍然存在一些问题,我在更新的答案中提供了链接。 - chhantyal

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