【发布时间】: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