首页 > 解决方案 > Hive 或 Spark 查询中的爆炸问题

问题描述

有大约 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 个测量值,输入表中的单行将使用我上面的 SQL 生成 2^15 = 32,768 行。

输入表中有 500,000 行。

标签: apache-sparkhiveapache-spark-sqlhiveql

解决方案


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

然后我加入所有 15 个 SQL。


推荐阅读