如果文件具有不同的列数,如何将数据加载到相同的Hive表

时间:2016-09-19 19:04:34

标签: hadoop hive hiveql hadoop2

我有一个主表(Employee),它有10列,我可以使用load data inpath /file1.txt into table Employee

将数据加载到其中

我的问题是如果我的文件file2.txt具有相同的列但缺少第3列和第5列,如何处理同一个表(Employee)。如果我直接加载数据,最后一列将是NULL NULL。但它应该将第3列作为NULL加载,第5列作为NULL加载。

假设我有一个表Employee,并且我想将file1.txtfile2.txt加载到表中。

file1.txt
==========
id name sal deptid state coutry  
1  aaa  1000 01   TS   india  
2  bbb  2000 02   AP   india  
3  ccc  3000 03   BGL   india  


file2.txt  

id  name   deptid country  
1  second   001   US  
2  third    002   ENG  
3  forth    003   AUS  

file2.txt中,我们缺少2列,即salstate

我们需要使用相同的Employee表来处理它吗?

2 个答案:

答案 0 :(得分:0)

我不知道有任何方法可以创建一个由具有非同质结构的数据文件支持的表。但是,您可以为不同的列配置定义单独的表,然后定义查询两者的视图。

我认为如果我提供一个例子会更容易。我将使用两个人的表,两个都有一个名称列,但一个存储高度,而另一个存储重量:

> create table table1(name string, height int);
> insert into table1 values ('Alice', 178), ('Charlie', 185);

> create table table2(name string, weight int);
> insert into table2 values ('Bob', 98), ('Denise', 52);

> create view people as
>     select name, height, NULL as weight from table1
>   union all
>     select name, NULL as height, weight from table2;

> select * from people order by name;
+---------+--------+--------+
| name    | height | weight |
+---------+--------+--------+
| Alice   | 178    | NULL   |
| Bob     | NULL   | 98     |
| Charlie | 185    | NULL   |
| Denise  | NULL   | 52     |
+---------+--------+--------+

或者作为你问题的一个更接近的例子,假设一张桌子有名字,身高和体重,而另一张桌子只有名字和体重,因此身高“从中间缺失”:

> create table table1(name string, height int, weight int);
> insert into table1 values ('Alice', 178, 55), ('Charlie', 185, 78);

> create table table2(name string, weight int);
> insert into table2 values ('Bob', 98), ('Denise', 52);

> create view people as
>     select name, height, weight from table1
>   union all
>     select name, NULL as height, weight from table2;

> select * from people order by name;
+---------+--------+--------+
| name    | height | weight |
+---------+--------+--------+
| Alice   | 178    | 55     |
| Bob     | NULL   | 98     |
| Charlie | 185    | 78     |
| Denise  | NULL   | 52     |
+---------+--------+--------+

请务必使用union all而不只是union,因为后者会尝试删除重复的行,这会让它变得非常昂贵。

答案 1 :(得分:0)

似乎无法直接加载到指定的列中。

因此,您可能需要这样做:

  1. 将路径中的数据加载到与文件
  2. 匹配的(临时?)表中
  3. 通过选择上一个表的内容插入到决赛桌的相关列中。
  4. 情况与this question非常相似,它涵盖了相反的情况(您只想加载几列)。