Hive动态分区

Bae*_*mla 11 hadoop hive hiveql

我正在尝试使用动态分区创建分区表,但我遇到了一个问题.我在Hortonworks Sandbox 2.0上运行Hive 0.12.

set hive.exec.dynamic.partition=true;
INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country
FROM demo_stg t;
Run Code Online (Sandbox Code Playgroud)

但它不起作用..我得到一个错误.

这是创建表demo_stg的Query :

create table demo_stg
(
    country STRING,
    stadt STRING,
    geograph_breite FLOAT,
    id INT
    )
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\073";
Run Code Online (Sandbox Code Playgroud)

demo_tab:

CREATE TABLE demo_tab 
(
    stadt STRING,
    geograph_breite FLOAT,
    id INT
)
PARTITIONED BY (land STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\073";
Run Code Online (Sandbox Code Playgroud)
  • demo_stg也填充了数据,所以它不是空的.

感谢帮助 :)

Tan*_*eer 17

您需要修改您的选择:

set hive.exec.dynamic.partition=true;
INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country
FROM demo_stg t;
Run Code Online (Sandbox Code Playgroud)

我不确定您的演示阶段中哪个列要执行分区,或者哪个列在demo中对应于land.但无论列是什么,它都应该作为select中的最后一列出现,说你的演示表列名是id,所以你的select应该写成:

INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country,t.id as land
FROM demo_stg t;
Run Code Online (Sandbox Code Playgroud)

我认为这应该有效.


小智 8

分区列必须是select查询中的最后一列.

除了将分区设置为true之外,还需要将模式设置为nonstrict:

set hive.exec.dynamic.partition.mode=nonstrict
Run Code Online (Sandbox Code Playgroud)