【问题标题】:copy data from one table to another partitioning table将数据从一个表复制到另一个分区表
【发布时间】:2020-10-03 00:51:44
【问题描述】:
%hive
INSERT INTO NEWPARTITIONING partition(year(L_SHIPDATE)) select * from LINEITEM;

我想将行项目中的数据复制到分区表NEWPARTITIONING,但出现以下错误:

第 1:54 行无法识别语句中 ')' 'select' '*' 附近的输入。

不明白为什么会发生此错误。谁能给我一些想法

【问题讨论】:

  • 我不确定您是否可以在分区子句中传递函数。为什么不在LINEITEM 表中创建一个新列(或创建一个关闭的视图)并尝试这个INSERT INTO NEWPARTITIONING partition(yyyy_L_shipdt)) select * from LINEITEM; 如果动态分区,您需要确保源中的最后一列应该与分区匹配。

标签: hive hiveql partitioning hive-partitions


【解决方案1】:

Hive 支持 DYNAMICSTATIC 分区加载。

分区规范只允许列名或列列表(用于动态分区加载),如果需要函数,则在select中计算,见下例:

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

insert into table NEWPARTITIONING partition (partition_column)
select i.col1,
       ...
       i.colN,
       year(L_SHIPDATE) as partition_column --Partition should be the last in column list
  from LINEITEM i 

或者您可以指定static分区,格式为partition(partition_column='value'),此时无需选择分区表达式:

insert into table NEWPARTITIONING partition (partition_column='2020-01-01')
select i.col1,
       ...
       i.colN
  from LINEITEM i 
 where year(L_SHIPDATE)  = '2020-01-01' 

在这两种情况下 - STATIC 和 DYNAMIC,Hive 都不支持分区规范中的函数。函数可以在查询中计算(动态负载)或在包装器外壳中计算并作为参数传递给脚本(用于静态分区)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2011-05-16
    • 2023-03-16
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多