Hive从小表创建大表

时间:2017-01-24 22:58:39

标签: join apache-spark hive

我在hive中有1000个表。所有都有相同的列。这些表将逐步更新。列是ID,名称,dno,loc,sal ...... 我想通过从每个表中仅选择Id,name和sal来创建一个大表。

Table 1:
ID name dno loc sal  ………
1  sam  201 HYD 2000 ………

Table2
ID name dno loc sal ………
2  Ram  203 BAN 3000    ………

Table 3
ID name dno loc sal ………
3  Bam  301 NY  4000    ………

等等......

大表:

ID  name sal    
1   sam  2000   
2   Ram  3000
3   Bam  4000

等等

这就是我想要实现的目标。

说如果明天有新的记录,请插入表3,用Id 100说,名字杰克......

表3包含新记录

Table 3
ID  name dno    loc sal ………
3   Bam  301    NY  4000    ………
100 Jack 101    LA  5000    ……….

新的大表应该是

ID  name sal    
1   sam  2000   
2   Ram  3000
3   Bam  4000
100 Jack 5000

这是我想要在每次将新记录插入原始1000个表时删除大表的目的而实现的目标

3 个答案:

答案 0 :(得分:1)

ravinder的略微修改版本。

如下所示创建子外部表。

   create external table table1 (
    column1 String,
    Column2 String
    )
    row format delimited                                                                                       
    fields terminated by ','
    LOCATION '/user/cloudera/data_p/table_name=data1/';

现在,您的父表将使用分区列table_name创建。

create external table parent_table (
column1 String,
Column2 String
)
partitioned by (table_name String)
row format delimited                                                                                       
fields terminated by ','
LOCATION '/user/cloudera/data_p/';
  

msck修复表parent_table;

enter image description here

答案 1 :(得分:0)

如果您的所有表之间的ID都是唯一的,您可以更新您的大表,如

with q1 as ( 
select * from T1 where ID not in (select ID from BIGTABLE)
union
select * from T2 where ID not in (select ID from BIGTABLE)    
.... so on
)
from q1
insert into table BIGTABLE select *; 

如果您可以在不同的表之间找到相同的ID(例如,在T1和T4中,例如ID = 1),我建议在大表中使用一个额外的列来标识记录源(来自它来自哪些表)或分区数据(取决于数据的大小)。如果某些事情没有意义,发表评论

问候!

编辑:就像我在评论中说的,如果不可能为所有表做一个联合,我建议创建一个分区表。这个想法是在这个表中添加一个指向其他表的位置的分区,这样你应该能够应用我之前写过的逻辑,如果你使用模式进化使用avro / parquet格式,这是可能的。 。

答案 2 :(得分:0)

你可以做几种方式,但如果没有限制,我喜欢下面的内容。确保所有小表位置都是一个目录。

如果以下不起作用,需要更多信息(小表命名的标准,表格的行格式)(另一种方法是创建一个从元数据中选择的脚本并获取小表名,并使用union来执行一个脚本小数据并插入大表)

小桌子r1& r2和大桌部

create table r1
(dept int
,dept_name string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION '/apps/hive/warehouse/dept/r1';

create table r2
(dept int
,dept_name string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION '/apps/hive/warehouse/dept/r2';


[root@sandbox ~]# hadoop fs -ls -R /apps/hive/warehouse/dept
drwxrwxrwx   - root hdfs          0 2017-01-25 17:43         /apps/hive/warehouse/dept/r1
-rwxrwxrwx   3 root hdfs        105 2017-01-25 17:43     /apps/hive/warehouse/dept/r1/000000_0
-rwxrwxrwx   3 root hdfs          0 2017-01-25 17:43 /apps/hive/warehouse/dept/r1/000001_0
drwxrwxrwx   - root hdfs          0 2017-01-25 17:44 /apps/hive/warehouse/dept/r2
-rwxrwxrwx   3 root hdfs        105 2017-01-25 17:44 /apps/hive/warehouse/dept/r2/000000_0
-rwxrwxrwx   3 root hdfs          0 2017-01-25 17:44 /apps/hive/warehouse/dept/r2/000001_0



create external table dept
(dept int
,dept_name string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION '/apps/hive/warehouse/dept/';