【问题标题】:Hive Create big table from small tablesHive 从小表创建大表
【发布时间】:2017-01-28 06:02:10
【问题描述】:

我在 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,命名为 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 个表时不删除大表来实现的目标

【问题讨论】:

    标签: join apache-spark hive


    【解决方案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;

    【讨论】:

      【解决方案2】:

      如果 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 格式使用模式演化,这是可以做到的.

      【讨论】:

      • 对于示例,我有 10 张桌子,但如果我有 1000 多张桌子,你会怎么做。我认为对 1000 个表进行联合不是正确的解决方案
      • 如果不可能并且所有表都具有相同的结构,我建议创建一个与 1000 个表具有相同结构的分区表。这个想法是在这个表中添加一个分区,指向其他表中的位置,这样你应该能够应用我之前写的逻辑,甚至更好!该表将是您的 BIGTABLE :)
      • 我已正确编辑问题,请查看并告诉我
      【解决方案3】:

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

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

      小桌子 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/';
      

      【讨论】:

      • 我重新创建了您在此处提供的脚本,但是当我从部门中选择 * 时。它显示零结果
      • r1 和 r2 中是否有数据,并且位置类似于 '/apps/hive/warehouse/dept/'
      猜你喜欢
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多