【问题标题】:Hive - create an internal table from three external tablesHive - 从三个外部表创建一个内部表
【发布时间】:2020-04-24 11:05:11
【问题描述】:

我在 HIVE 中有三个外部表:

表 1:

CREATE EXTERNAL TABLE IF NOT EXISTS table_1(
unique_key_column_1 VARCHAR,
column_needed_1 DATE,   
redundant_column_1 VARCHAR,
redundant_column_2 VARCHAR,
redundant_column_3 VARCHAR,
column_needed_2 TIMESTAMP,
redundant_column_4 VARCHAR,
redundant_column_5 VARCHAR,
column_needed_3 INT,
redundant_column_6 VARCHAR,
redundant_column_7 VARCHAR)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',’
STORED AS TEXTFILE location '/user/<username>/visdata';

表 2:

CREATE EXTERNAL TABLE IF NOT EXISTS table_2(
unique_key_column_1 VARCHAR,
column_needed_4 VARCHAR,
column_needed_5 VARCHAR,
unique_key_column_2 VARCHAR,
redundant_column_1 VARCHAR,
redundant_column_2 VARCHAR,
redundant_column_3 VARCHAR,
column_needed_6 TINYINT,
redundant_column_4 VARCHAR,
redundant_column_5 VARCHAR,
column_needed_7 DATE,
redundant_column_6 VARCHAR,
redundant_column_7 VARCHAR)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',’
STORED AS TEXTFILE location '/user/<username>/visdata';

表 3:

CREATE EXTERNAL TABLE IF NOT EXISTS table_3(
unique_key_column_2 VARCHAR,
redundant_column_1 VARCHAR,
redundant_column_2 VARCHAR,
redundant_column_3 VARCHAR,
redundant_column_4 VARCHAR,
redundant_column_5 VARCHAR,
column_needed_8 VARCHAR,
column_needed_9 TINYINT,
redundant_column_6 VARCHAR,
redundant_column_7 VARCHAR,
column_needed_10 TIMESTAMP)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',’
STORED AS TEXTFILE location '/user/<username>/visdata';

我现在想创建一个托管表,在我的两个唯一键列上的表上方左外连接,如下所示:

unique_key_column_1 column_needed_1 column_needed_2 column_needed_3 column_needed_4 column_needed_5 column_needed_1 column_needed_6 column_needed_7 unique_key_column_2 column_needed_8 column_needed_9 column_needed_10
key_entry_1_1 entry_1_1 entry_1_2 entry_1_3 entry_1_4 entry_1_5 entry_1_6 entry_1_7 key_entry_1_2 entry_1_8 entry_1_9 entry_1_10
key_entry_2_2 entry_2_1 entry_2_2 entry_2_3 entry_2_4 entry_2_5 entry_2_6 entry_2_7 key_entry_2_2 entry_2_8 entry_2_9 entry_2_10

我该怎么做?

编辑 1:
这是我能想出的,从两张桌子加入。我仍然无法弄清楚如何将三个表连接成一个表:

> create table combined_table;
> insert into combined_table SELECT * FROM (SELECT r.unique_key_column_1, r.column_needed_1, r.column_needed_2, r.column_needed_3, o.r.column_needed_4, o.column_needed_5, o.column_needed_6, o.column_needed_7 FROM table_1 LEFT OUTER JOIN table_2 o ON (r.unique_key_column_1 = o.unique_key_column_2 );

编辑 2:
我刚刚意识到连接很昂贵。那么,我可以使用分区来做到这一点吗?

【问题讨论】:

    标签: hive hdfs hiveql hive-table


    【解决方案1】:

    @NaveenKumar 这里的解决方案是为您想要的组合表编写架构。然后将 3 个表中的结果插入到最终表中。

    INSERT INTO combinedTable [SELECT JOIN QUERY HERE]
    

    【讨论】:

    • > 创建表 combine_table; > 插入combined_table SELECT * FROM (SELECT r.unique_key_column_1, r.column_needed_1, r.column_needed_2, r.column_needed_3, o.r.column_needed_4, o.column_needed_5, o.column_needed_6, o.column_needed_7 FROM table_1 LEFT unique_key_column_1 = o.unique_key_column_2);
    • 这是我想出的,将两张表的数据合并,但我不知道如何从三张表中制作一张表。 @steven-dfheinz
    • 您需要使用模式(来自原始表)为最终表中所需的列执行创建语句。因此,您总共制作了 4 张桌子。第四个通常不是外部的(删除外部+位置)。前 3 个表成为临时表,最后的第 4 个表是您真正想要的组合结果...
    • 我不太了解你。能否请您写一些示例语法。
    【解决方案2】:

    您可以通过左连接所有三个表来创建组合表。检查以下查询。

    创建表格和插入数据。

    CREATE TABLE IF NOT EXISTS COMBINED_TABLE AS 
    SELECT
       UNIQUE_KEY_COLUMN_1,
       TBLA.COLUMN_NEEDED_1,
       TBLA.COLUMN_NEEDED_2,
       TBLA.COLUMN_NEEDED_3,
       TBLB.COLUMN_NEEDED_4,
       TBLB.COLUMN_NEEDED_5,
       TBLB.COLUMN_NEEDED_6,
       TBLB.COLUMN_NEEDED_7,
       TBLC.UNIQUE_KEY_COLUMN_2,
       TBLC.COLUMN_NEEDED_8,
       TBLC.COLUMN_NEEDED_9,
       TBLC.COLUMN_NEEDED_10,
    FROM
       TABLE_1 TBLA 
       LEFT JOIN
          TABLE_2 TBLB 
          ON TBLA.UNIQUE_KEY_COLUMN_1 = TBLB.UNIQUE_KEY_COLUMN_1 
       LEFT JOIN
          TABLE_3 TBLC 
          ON TBLC.UNIQUE_KEY_COLUMN_2 = TBLB.UNIQUE_KEY_COLUMN_1;
    
    

    如果目标表已经创建,则将数据插入表中。

    INSERT INTO COMBINED_TABLE
    SELECT
       UNIQUE_KEY_COLUMN_1,
       TBLA.COLUMN_NEEDED_1,
       TBLA.COLUMN_NEEDED_2,
       TBLA.COLUMN_NEEDED_3,
       TBLB.COLUMN_NEEDED_4,
       TBLB.COLUMN_NEEDED_5,
       TBLB.COLUMN_NEEDED_6,
       TBLB.COLUMN_NEEDED_7,
       TBLC.UNIQUE_KEY_COLUMN_2,
       TBLC.COLUMN_NEEDED_8,
       TBLC.COLUMN_NEEDED_9,
       TBLC.COLUMN_NEEDED_10,
    FROM
       TABLE_1 TBLA 
       LEFT JOIN
          TABLE_2 TBLB 
          ON TBLA.UNIQUE_KEY_COLUMN_1 = TBLB.UNIQUE_KEY_COLUMN_1 
       LEFT JOIN
          TABLE_3 TBLC 
          ON TBLC.UNIQUE_KEY_COLUMN_2 = TBLB.UNIQUE_KEY_COLUMN_1;
    
    

    【讨论】:

    • 非常感谢您。我在第一次编辑我的问题后不久就发现了这一点,并意识到加入很昂贵。你能帮我用分区做这件事吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多