【问题标题】:Join tables with different columns using Hive sql使用 Hive sql 连接具有不同列的表
【发布时间】:2018-11-16 20:37:07
【问题描述】:

我正在使用 AWS 集群将许多带有嵌套数据的 JSON 文件处理到 Hive 扁平表中。

有些数据集非常大,所以我需要将其拆分成块,并为每个块制作单独的小 Hive 表,这导致这些较小的表具有不同的列。 例如,table1 具有列 A1....A1000table2 具有列 A1,A3,A100,...A1000A1001(因此有些列是常见的,有些列对于每个表都是唯一的)。

有没有办法将这些小表(可能是数百个表,每个表大约 1e7 行)附加、联合或连接到一个大 Hive 表中,该表包含小表中的所有列(以及缺失单元格中的 NULL)对于每个最初没有该特定列的小表)? 喜欢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)

当我将其展平以获得常规 Hive 表时,根据每个块中碰巧出现的 json 文件集,ids 数组中的元素数量(例如)可能不同,因此输出列将是也不同:比如 aaa_ids_bbb1_0(对于 ids 数组的第 0 个元素),...,aaa_ids_bbb1_999(对于第 999 个元素,如果恰好有 1000 个元素)。所以每个块中的表可以不同。

在 python pandas 模块中,如果我将 3 个数据帧与列 A、B、C(第 1 列)、A、C、D(第 2 列)和 D、E、F(第 3 列)连接起来,则生成的数据帧将包含列 A ,B,C,D,E,F。当然,如果可能的话,我需要在 Hive SQL 中做同样的事情。

【问题讨论】:

  • 请提供一些 JSON 的简短示例并解释您为什么创建具有不同结构的表
  • 我无法提供 json 文件示例,这些文件很大,但我更新了我的问题,解释了块如何具有不同的结构。

标签: sql amazon-web-services join hive union


【解决方案1】:

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

简单UNION ALL:

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

在这种情况下可以正常工作。最好将所有文件放在同一个表位置,没有 UNION 也可以正常工作。

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

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

【讨论】:

  • 谢谢@leftjoin。但是“基于 JSONSerDe”是什么意思?它是否要求所有块表都包含所有可用 json 文件中的所有可能列,而不仅仅是每个特定块中包含的文件中的列?在我的例子中,这些块表是通过扁平化(在 pandas 模块的帮助下)所有 json 文件的一部分创建的,即包含在这个特定块中的文件。我没有使用 JSONSerDe,而是将 pandas df 转换为 Hive 表。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多