Join 配置单元从小表创建大表

Join 配置单元从小表创建大表,join,apache-spark,hive,Join,Apache Spark,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 3

我在蜂箱里有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,名字为jack

表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个表中插入新记录时,不必删除大表

如果所有表之间的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格式,这是可能的

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

如果以下方法不起作用,则需要更多信息(小表的命名标准,表的行格式)(另一种方法是创建一个脚本,从元数据中进行选择,获取小表名,并使用小数据中的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/';

稍微修改版本的ravinder

创建子外部表,如下所示

   create external table table1 (
    column1 String,
    Column2 String
    )
    row format delimited                                                                                       
    fields terminated by ','
    LOCATION '/user/cloudera/data_p/table_name=data1/';
现在,您的父表将使用分区列表名称创建

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修复表父表


对于示例,我有10个表,但如果我有1000多个表,您会如何操作。我认为在1000个表上进行联合不是正确的解决方案。如果不可能,并且所有表都具有相同的结构,我建议创建一个分区表,其结构与您的1000个表相同。我们的想法是在这个表中添加一个分区,指向其他表中的位置,这样您就可以应用我以前编写的逻辑,甚至更好!该表将是您的BIGTABLE:)我已正确编辑了问题,请看一看,并让我知道我重新创建了您在此处给出的脚本,但当我从部门选择*时,它显示零结果r1和r2中是否有数据,并且位置与“/apps/hive/warehouse/dept/”类似