hive - 在 hive 中将列数据分成多列
问题描述
我有一个包含两个控制器及其版本的设备的示例数据。样本数据如下:
device_id controller_id versions
123 1 0.1
123 2 0.15
456 2 0.25
143 1 0.35
143 2 0.36
上述数据应采用以下格式:
device_id 1st_ctrl_id_ver 2nd_ctrl_id_ver
123 0.1 0.15
456 NULL 0.25
143 0.35 0.36
我使用了以下不起作用的代码:
select
device_id,
case when controller_id="1" then versions end as 1st_ctrl_id_ver,
case when controller_id="2" then versions end as 2nd_ctrl_id_ver
from device_versions
我得到的输出是:
device_id 1st_ctrl_id_ver 2nd_ctrl_id_ver
123 0.1 NULL
123 NULL 0.15
456 NULL 0.25
143 0.35 NULL
143 NULL 0.36
我不希望每一行都有 Null 值。有人可以帮我编写正确的代码吗?
解决方案
要将具有给定键的所有行“折叠”为一行,您必须运行聚合。即使您在实践中并没有真正聚合价值。
就像是
select device_id,
MAX(case when controller_id="1" then versions end) as 1st_ctrl_id_ver,
MAX(case when controller_id="2" then versions end) as 2nd_ctrl_id_ver
from device_versions
GROUP BY device_id
但请注意,当且仅当每个设备的每个控制器最多有一个条目时,此代码才有效,并且版本高于 2 的任何控制器都将被忽略。换句话说,它相当脆弱(但你不能在 SQL 中做得更好)
推荐阅读
- python - 具有随机权重的神经网络不学习
- c# - 在 ASP.NET 中使用确认对话框并在运行时获取其结果
- javascript - 找出哪个滚动元素具有键盘焦点
- python - 为什么用opencv在圆外绘制的矩形不显示?
- google-drive-api - 以编程方式在谷歌文档中打开上传的谷歌驱动器文件
- ios - 在 Appium 中,我正在尝试使用 xpath 访问(点击按钮或编辑文本字段中的文本)webview 中的元素。但我做不到
- user-interface - 根据移动高度反应本机输入高度
- unit-testing - 使用 spring boot、kotlin 和 junit 进行 Rest 控制器单元测试
- java - 在 IDEA 中为特定字符串启用 sql 语法突出显示
- grails - Grails 3 enumType 用于枚举集