【问题标题】:Problem with explode in Hive or Spark queryHive 或 Spark 查询中的爆炸问题
【发布时间】:2021-12-04 01:02:07
【问题描述】:

有大约 500,000 行的 Hive 表。 它有一个保存 JSON 字符串的列。 JSON 存储来自 15 台设备的测量结果,如下所示:

company_id=…
device_1:
   array of measurements
      every single measurements has 2 attributes:
        value=
        date=

device_2:
 …
device_3
 …
device_15
...

json 中有 15 个设备,每个设备内部都有嵌套的测量数组。测量数组的大小不固定。

我们的目标是仅从测量中获得每台设备具有 max(date) 的测量值。

SELECT 的输出应该有以下列:

company_id
device_1_value
device_1_date
...
device_15_value
device_15_date

我尝试使用 LATERAL VIEW 来分解测量数组:

SELECT get_json_object(json_string,'$.company_id),
d1.value, d1.date, ... d15.value, d15.date
FROM T
LATERAL VIEW explode(device_1.measurements) as d1
LATERAL VIEW explode(device_2.measurements) as d2
 …
LATERAL VIEW explode(device_15.measurements) as d15

我可以将此 SQL 的结果用作另一个 SQL 的输入,该 SQL 将提取每个设备的 max(date) 记录。

我的方法不能很好地扩展:每个设备有 15 个设备和 2 个测量值,输入表中的单行将生成 2^15 = 32,768 行,使用我上面的 SQL。

输入表有 500,000 行。

【问题讨论】:

  • 请更新您的问题以包含一些示例记录。
  • 多个横向视图产生笛卡尔积。数据示例是必要的。另外还不清楚您是如何在查询中获得 device_1, device_2 ... device_15 属性的,根据您的描述,它们不应该在 JSON 中吗?你是用 JSON SerDe 创建表还是什么?请同时提供表格 DDL
  • 为了避免多个横向视图生成笛卡尔积,我将原始 SQL 拆分为 15 个独立的 SQL,其中单个 SQL 只有 1 个横向视图。然后我加入所有 15 个 SQL。

标签: apache-spark hive apache-spark-sql hiveql


【解决方案1】:

您实际上处于一个很好的位置,可以制作更便宜的表格/加入。捆绑(您的 JSON 字符串)是一种优化技巧,用于获取丑陋的连接/表并对其进行优化。

缺点是您可能应该使用 hive user defined function 或 spark 函数来配对数据。 SQL 很棒,但很可能这不是这项工作的正确工具。您可能希望使用一种编程语言来帮助将这些数据提取为适用于 SQL 的格式。

【讨论】:

    【解决方案2】:

    为了避免多个横向视图生成笛卡尔积,我将原始 SQL 拆分为 15 个独立 SQL(每个设备一个),其中单个 SQL 只有 1 个横向视图。

    然后我加入所有 15 个 SQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2022-01-18
      • 1970-01-01
      • 2022-01-16
      • 2019-12-27
      • 2017-07-13
      相关资源
      最近更新 更多