蜂巢。动态分区和插入特定列

时间:2016-11-21 10:44:50

标签: hadoop hive hadoop-partitioning

有一个大约100列的HIVE表,按ClientNumber和Date列分区。 我试图将另一个HIVE表中的数据插入到30列中,并动态创建Date个分区。

问题是所有数据都被加载到" ClientNumber = 123 / date = __ HIVE_DEFAULT_PARTITION __"分区是不太令人期待的。

脚本如下所示:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

FROM DBName.Table2
INSERT INTO TABLE DBName.Table1
PARTITION(ClientNumber=123, `Date`)   
(col1, col2, ..., col29, `Date`) 
SELECT 
col1, col2, ..., col29, eventDate as `Date`
查询检索的

Date值都是正确的,没有NULL或其他非特征值。 删除或添加动态分区参数没有任何区别。 提供特定的Date值(而不是动态查询填充值)会导致创建正确的分区。

我是否缺少任何技巧或填充分区表中特定列数的问题?

P.S。是否将导入脚本中的所有其他列(col31-col100)列为NULL值得考虑?

3 个答案:

答案 0 :(得分:0)

如果我对你提出正确的问题,你就不应该有“约会对象”。插入或选择中的字段。如果您使用别名,它可能会破坏分区规则的要求。因为它期望相同的字段定义模式。脚本应该是......

FROM DBName.Table2
INSERT INTO TABLE DBName.Table1
PARTITION(ClientNumber=123, Date)   
SELECT col1, col2, ..., col29, eventDate as Date

答案 1 :(得分:0)

是的,有一种更好的方法来提供许多列名称。您可以使用Hive的“ Regex列规范”:列名称的正则表达式。您的查询将是:

    SET hive.support.quoted.identifiers=none;
    FROM DBName.Table2
    INSERT INTO TABLE DBName.Table1
    PARTITION(ClientNumber=123, Date)   
    SELECT `(eventDate)?+.+`, eventDate as Date;

这意味着“从Table2中选择除eventDate之外的所有名称”。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select#LanguageManualSelect-REGEXColumnSpecification

对于某些用例,以及在我曾编写脚本以根据表模式自动生成Hive查询的其他地方,这仍然很笨拙。

答案 2 :(得分:0)

如果对某人有用,则值得阅读Corrupt rows written to __HIVE_DEFAULT_PARTITION__ when attempting to overwrite Hive partition中的答案

我花了一些愚蠢的时间处理相同的问题,然后才意识到分区列应位于DF的末尾是有限制的。就我而言,我只是以选择分区列为最后的方式更改了DF的SQL查询。

相关问题