apache-spark - 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 行。
解决方案
为了避免由多个横向视图生成的笛卡尔积,我将原始 SQL 拆分为 15 个独立的 SQL(每个设备一个),其中单个 SQL 只有 1 个横向视图。
然后我加入所有 15 个 SQL。
推荐阅读
- twilio - 如何将默认读出消息“感谢您试用我们的文档。享受”更改为自定义消息
- node.js - 为 Strapi 项目设置测试环境
- c++ - 关于类和对象的初学者问题
- python - 如何运行脚本的多次迭代?
- html - 引用重复命名的 css 网格行
- javascript - 动态更改 css 文件
- laravel - 当我单击 laravel 发送到我的 gmail 的电子邮件验证链接时,它会将我重定向到显示 - 403 此操作未经授权的页面
- reactjs - 安装 React 应用程序时出现此错误
- win32com - 连接到 SAP GUI 时 win32com.client.GetObject 出错
- php - 如何在 php 中解析 bbcode [youtube]id[/youtube]