有一个大约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值得考虑?
答案 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之外的所有名称”。
对于某些用例,以及在我曾编写脚本以根据表模式自动生成Hive查询的其他地方,这仍然很笨拙。
答案 2 :(得分:0)
如果对某人有用,则值得阅读Corrupt rows written to __HIVE_DEFAULT_PARTITION__ when attempting to overwrite Hive partition中的答案
我花了一些愚蠢的时间处理相同的问题,然后才意识到分区列应位于DF的末尾是有限制的。就我而言,我只是以选择分区列为最后的方式更改了DF的SQL查询。