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

zed5wv10  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(201)

我使用aws cluster将许多包含嵌套数据的json文件处理到配置单元扁平表中。
有些数据集非常大,所以我需要将其拆分为块,并为每个块创建单独的小配置单元表,这导致这些较小的表具有不同的列。例如, 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数组中的元素数(例如)可能不同,因此输出列也会不同:如aaa挈ids挈bbb1挈0(对于ids数组的第0个元素),…,aaa挈ids挈bbb1挈999(对于第999;个元素,如果恰好有1000个元素)。所以每个块中的表可以不同。
在python模块中,如果我将3个Dataframe与列a、b、c(第1列)、a、c、d(第2列)和d、e、f(第3列)连接起来,得到的Dataframe将具有列a、b、c、d、e、f。我需要做同样的事情,但在配置单元sql中,如果可能的话当然。

yfjy0ee7

yfjy0ee71#

1) 如果您的表是基于jsonserde的,那么您可以用相同的结构重新创建表,缺少的元素将为null。
简单 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 
...

相关问题