hadoop—如果文件的列数不同,如何将数据加载到同一个配置单元表

1bqhqjot  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(417)

我有一个主表(employee),它有10列,我可以使用 load data inpath /file1.txt into table Employee 我的问题是,如果文件file2.txt有相同的列,但缺少第3列和第5列,如何处理相同的表(employee)。如果我直接加载数据,最后一列将是
NULL NULL . 但它应该将第3列加载为null,将第5列加载为null。
假设我有一个表雇员,我想加载 file1.txt 以及 file2.txt 到table上去。

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 我们缺少两列,即。 sal 以及 state .
我们需要使用同一个employee表如何处理它?

brtdzjyr

brtdzjyr1#

似乎没有办法直接加载到指定的列中。
因此,您可能需要这样做:
将数据inpath加载到与文件匹配的(临时?)表中
通过选择上一个表的内容插入到最终表的相关列中。
这种情况非常类似于这个问题,它涵盖了相反的场景(您只想加载几个列)。

dvtswwa3

dvtswwa32#

我不知道有什么方法可以创建一个由具有非同质结构的数据文件支持的表。但是,您可以为不同的列配置定义单独的表,然后定义一个同时查询这两个列的视图。
我想我举个例子比较容易。我将使用两张人名表,两张人名表都有一列,但其中一张表也存储身高,而另一张表则存储体重:

> 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 ,因为后者试图删除重复的行,这使得它非常昂贵。

相关问题