Join 配置单元从小表创建大表
我在蜂箱里有1000张桌子。它们都有相同的列。这些表将以增量方式更新。列为ID、名称、dno、loc、sal…。。 我想通过从每个表中只选择Id、name和sal来创建一个大表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
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/”类似