代码之家  ›  专栏  ›  技术社区  ›  lugger1

使用配置单元SQL连接具有不同列的表

  •  0
  • lugger1  · 技术社区  · 6 年前

    我使用AWS集群来处理许多带有嵌套数据的JSON文件到HIVE扁平化表中。

    有些数据集非常大,因此我需要将其拆分为块,并为每个块创建单独的小配置单元表,这将导致这个较小的表具有不同的列。 例如, table1 有列 A1....A1000 我是说, table2 有列 A1,A3,A100,...A1000 ,和 A1001 (因此,有些列是通用的,有些列对于每个表是唯一的)。

    有没有办法将这些小表(可以是数百个表,每个表有~1e7行)追加、联合或联接到一个大的配置单元表中,该配置单元表包含来自小表的所有列(对于最初没有特定列的每个小表,缺少的单元格中有空值)? 喜欢 Total_table 带列 A1...A1001 是吗?

    upd:printschema()命令将显示如下内容:

    root
     |-- aaa: struct (nullable = true)
     |    |-- ids: array (nullable = true)
     |    |    |-- element: struct (containsNull = true)
     |    |    |    |-- bb1: string (nullable = true)
     |    |    |    |-- bb2: string (nullable = true)
     |    |    |    |-- bb3: string (nullable = true)
    

    当我将其展平以获取常规配置单元表时,根据每个块中碰巧存在的json文件集,ids数组中的元素数量(例如)可能不同,因此输出列也会不同:如a a a-ids-bbb1-0(对于ids数组的第0个元素),…,aaa-ids-bbb1-999(对于第999个元素,如果碰巧存在1000个元素)。所以每个块中的表可以是不同的。

    在python熊猫模块中,如果我将列、a、b、c(第一)、a、c、d(第二)、d、E、f(第三)连接到3个子列表中,得到的子查询将有A、B、C、D、E、F列,如果可能的话,我需要做同样的事情,但在蜂房sql中。

    1 回复  |  直到 6 年前
        1
  •  0
  •   leftjoin    6 年前

    1)如果你的表是基于JSONSerDE的,那么你可以重新创建具有相同结构的表,缺少的元素将是空的。

    简单的 UNION ALL 以下内容:

    select col1,  from table 
    UNION ALL 
        select * from table 2 
        ...
    

    在这种情况下会起作用的。最好将所有文件放在同一个表位置,这样就可以在没有联合的情况下正常工作。

    2)如果不可能应用第一个(优选的)选项,则需要列出每个表中的所有列,为缺少的列提供空值:

    select A1, ... A1000, null A1001, null A1002  from table 
    UNION ALL 
    select A1, ... A1000, A1001, null A1002 from table 2 
    UNION ALL 
    ...