Hive 或 Spark 查询中的爆炸问题

Problem with explode in Hive or Spark query

有约 500,000 行的 Hive table。 它具有保留 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 台设备,其中每台设备内部都有嵌套的测量数组。 measurements 数组的大小不固定。

目标是从测量中仅获得每个设备的最大(日期)。

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 的输入,它将提取每个设备的最大(日期)记录。

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

输入中有 500,000 行 table。

您实际上处于有利位置,可以制造更便宜的 table/join。捆绑(您的 JSON 字符串)是一种优化技巧,用于处理非常丑陋的 joins/tables 并优化它们。

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

的格式

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

然后我加入所有 15 SQLs。