Hadoop 配置单元多次插入在DISTINCT select语句中出错

Hadoop 配置单元多次插入在DISTINCT select语句中出错,hadoop,hive,hiveql,Hadoop,Hive,Hiveql,我从“Hadoop最终指南”中阅读了这段代码: 但作为我的测试,使用几个不同的方法无法得到正确的结果 我的hiveql如下所示: CREATE TABLE IF NOT EXISTS a (logindate int, id int); 然后 将本地文件加载到此表 CREATE TABLE IF NOT EXISTS user (id INT) PARTITIONED BY (logindate INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\

我从“Hadoop最终指南”中阅读了这段代码:

但作为我的测试,使用几个不同的方法无法得到正确的结果

我的hiveql如下所示:

CREATE TABLE IF NOT EXISTS a (logindate int, id int);
然后 将本地文件加载到此表

CREATE TABLE IF NOT EXISTS user (id INT) PARTITIONED BY (logindate INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
然后 如果单独插入表格:

INSERT OVERWRITE TABLE user PARTITION(logindate=20130120) SELECT DISTINCT(id) FROM a WHERE logindate=20130120;
INSERT OVERWRITE TABLE user PARTITION(logindate=20130121) SELECT DISTINCT(id) FROM a WHERE logindate=20130121;
结果是正确的

但如果选择下一个多重插入hql:

FROM a
INSERT OVERWRITE TABLE user PARTITION(logindate=20130120) SELECT DISTINCT(id) WHERE logindate=20130120
INSERT OVERWRITE TABLE user PARTITION(logindate=20130121) SELECT DISTINCT(id) WHERE logindate=20130121;
the results are not correct, both partitions have the same number of records, seems like select from DISTINCT(id) WHERE logindate=20130120 OR logindate=20130121

那么这是一个bug还是我写了一些错误的语法?

DISTINCT在代码中有一点奇怪的历史记录,作为groupby的别名。 如果有bug,那么您使用的配置单元的版本很重要,因为bug在每个版本中都会被解决

这可能会奏效:

FROM a
INSERT OVERWRITE TABLE user PARTITION(logindate=20130120) SELECT id WHERE logindate=20130120 GROUP BY id
INSERT OVERWRITE TABLE user PARTITION(logindate=20130121) SELECT id WHERE logindate=20130121 GROUP BY id;
如果这不起作用,这肯定会起作用…即使这不是您尝试使用的方法

FROM (select distinct id, logindate from a where logindate in ('20130120','20130121')) subq_a
INSERT OVERWRITE TABLE user PARTITION(logindate=20130120) SELECT id WHERE logindate=20130120
INSERT OVERWRITE TABLE user PARTITION(logindate=20130120) SELECT id WHERE logindate=20130121;

我找到了一个解决方法来完成我的工作:
set hive.exec.dynamic.partition=true set hive.exec.dynamic.partition.mode=nostrict INSERT OVERWRITE TABLE user partition(logindate)从DISTRIBUTE BY logindate中选择DISTINCT(id),logindate
,使用动态分区初始化表数据。
FROM (select distinct id, logindate from a where logindate in ('20130120','20130121')) subq_a
INSERT OVERWRITE TABLE user PARTITION(logindate=20130120) SELECT id WHERE logindate=20130120
INSERT OVERWRITE TABLE user PARTITION(logindate=20130120) SELECT id WHERE logindate=20130121;