hive动态分区并插入到特定列中

xtfmy6hx  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(478)

有一个配置单元表,大约有100列,按clientnumber和date列划分。我试图将另一个配置单元表中的数据插入到30列中,并创建 Date 动态分区。
问题是,所有的数据都被加载到“clientnumber=123/date=\uhive\u default\u partition\uuuu”分区中,这并不是预期的。
脚本如下所示:

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、 是否值得考虑将导入脚本中的所有其他列(col31-col100)都列为null?
afdcj2ne

afdcj2ne1#

如果我答对了,您不应该在insert或select中有“date”字段。如果使用别名,可能会违反分区规则的要求。因为它需要与模式定义的相同的字段。剧本应该是。。。

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

ujv3wf0j2#

是的,有一个更好的方法来提供许多列名。您可以使用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;

这意味着“从表2中选择除eventdate之外的所有名称”。
https://cwiki.apache.org/confluence/display/hive/languagemanual+select#languagemanualselect-regexColumn规范
对于某些用例来说,这仍然是笨拙的,在我工作过的其他地方,我编写了脚本来从表模式自动生成配置单元查询。

9cbw7uwe

9cbw7uwe3#

如果对某些人有用,那么在试图覆盖配置单元分区时,读取写入到\uu配置单元\u默认\u分区的损坏行中的答案是值得的
在我意识到分区列应该在df的末尾是有限制的之前,我已经花了一些愚蠢的时间来讨论同一个问题。在我的例子中,我只是简单地更改了df的sql查询,将分区列选为last。

相关问题