有一个配置单元表,大约有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?
3条答案
按热度按时间afdcj2ne1#
如果我答对了,您不应该在insert或select中有“date”字段。如果使用别名,可能会违反分区规则的要求。因为它需要与模式定义的相同的字段。剧本应该是。。。
ujv3wf0j2#
是的,有一个更好的方法来提供许多列名。您可以使用hive的“regex列规范”:列名的正则表达式。您的问题是:
这意味着“从表2中选择除eventdate之外的所有名称”。
https://cwiki.apache.org/confluence/display/hive/languagemanual+select#languagemanualselect-regexColumn规范
对于某些用例来说,这仍然是笨拙的,在我工作过的其他地方,我编写了脚本来从表模式自动生成配置单元查询。
9cbw7uwe3#
如果对某些人有用,那么在试图覆盖配置单元分区时,读取写入到\uu配置单元\u默认\u分区的损坏行中的答案是值得的
在我意识到分区列应该在df的末尾是有限制的之前,我已经花了一些愚蠢的时间来讨论同一个问题。在我的例子中,我只是简单地更改了df的sql查询,将分区列选为last。