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。
有约 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。