为什么主表和临时表给出不同的结果?

v9tzhpje  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(329)

我有一个临时的外部表,并将来自hdfs的数据放入这个表中。现在,我将相同的数据插入到分区主外部表中。数据插入成功,但当我使用列查询主表时,得到的列值不同。
我已经使用csv文件将数据加载到包含四个字段的临时文件中。

col1=id
col2=visitDate
col3=comment
col4=age

以下是查询及其结果:
临时表:

create external table IF NOT EXISTS  dummy1(id string,visitDate string,comment string, age string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
;

MAIN Table:

create external table IF NOT EXISTS  dummy1(id string,comment string)
PARTITIONED BY (visitDate string, age string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC
;

Result:

Temporary table:

select *from incr_dummy1;

1       11      a       20
2       12      b       3
1       13      c       34
4       14      d       23
5       15      e       45
6       16      f       65
7       17      g       78
8       18      h       9
9       19      i       12
10      20      j       34

select visitDate,age from incr_dummy1;

11      20
12      3
13      34
14      23
15      45
16      65
17      78
18      9
19      12
20      34

Main Table:

select *from dummy1;

1       11      a       20
2       12      b       3
1       13      c       34
4       14      d       23
5       15      e       45
6       16      f       65
7       17      g       78
8       18      h       9
9       19      i       12
10      20      j       34

select visitDate,age from dummy1;

a       20
b       3
c       34
d       23
e       45
f       65
g       78
h       9
i       12
j       34

所以在上面的主外部表中,当我查询“visitdate”列时,“comment”列的值出现了。
请告诉我我犯了什么错误?

owfi6suc

owfi6suc1#

如我所见,列顺序是 not same in temporary and final tables .
从中插入数据时 Temporary table to final table 检查列的顺序是否正确 select statement(partition cols needs to be at the end of select cols) .

hive> insert into dummy1 partition(visitDate,age) select id,comment,visitDate,age from incr_dummy1;

以防万一,如果你仍然有问题,那么最好检查
因为您有一个外部分区表(当我们删除表数据时,它不会被删除到hdfs上), check the hdfs directory 有没有多余的文件没有被删除。
那么 drop the table, delete the hdfs directory 以及 create the table then run your job again .
更新: Option1: 是否可以按顺序匹配列 temporary table with final table ,如果是,则更改列的顺序。 Option2: 使用 subquery with quoted identifier 排除原始列并仅将别名列放入最终的select查询。

hive> set hive.support.quoted.identifiers=none;
hive> insert into dummy1 partition(visitDate,age)
      select `(visitDate|age)?+.+` from --exlude visitDate,age columns. 
     (select *,visitDate vis_dat,age age_n from incr_dummy1)t;

相关问题