mar*_*ark 7 json hadoop hive presto
给定一个包含JSON列的表,如下所示:
{"payload":[{"type":"b","value":"9"}, {"type":"a","value":"8"}]}
{"payload":[{"type":"c","value":"7"}, {"type":"b","value":"3"}]}
Run Code Online (Sandbox Code Playgroud)
如何编写Presto查询以获得b所有条目的平均值?
到目前为止,我认为我需要使用像Hive的横向视图爆炸这样的东西,其等价物是Presto中的交叉连接.
但我仍然坚持如何编写Presto查询cross join unnest.
如何使用cross join unnest扩展所有数组元素并选择它们?
Dav*_*vos 13
这是一个例子
with example(message) as (
VALUES
(json '{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'),
(json '{"payload":[{"type":"c","value":"7"}, {"type":"b","value":"3"}]}')
)
SELECT
n.type,
avg(n.value)
FROM example
CROSS JOIN
UNNEST(
CAST(
JSON_EXTRACT(message,'$.payload')
as ARRAY(ROW(type VARCHAR, value INTEGER))
)
) as x(n)
WHERE n.type = 'b'
GROUP BY n.type
Run Code Online (Sandbox Code Playgroud)
with定义了一个公用表表达式 (CTE),example其中一个列别名为message
VALUES 返回逐字表行集
UNNEST 在单行的一列中获取数组并将数组的元素作为多行返回。
CAST正在将JSON类型更改ARRAY为 所需的类型UNNEST。它可能很容易,ARRAY<MAP<但我发现ARRAY(ROW(更好,因为您可以指定列名,并在 select 子句中使用点表示法。
JSON_EXTRACT使用 jsonPath 表达式返回payload键的数组值
avg()并且group by应该熟悉SQL。
正如您所指出的,这最终在 Presto 0.79 中实现。:)
以下是此处的转换语法示例:
select cast(cast ('[1,2,3]' as json) as array<bigint>);
Run Code Online (Sandbox Code Playgroud)
特别提醒一下,Presto 中没有像 Hive 中那样的“字符串”类型。这意味着如果您的数组包含字符串,请确保使用“varchar”类型,否则您会收到一条错误消息,提示“类型数组不存在”,这可能会产生误导。
select cast(cast ('["1","2","3"]' as json) as array<varchar>);
Run Code Online (Sandbox Code Playgroud)
问题是我运行的是旧版本的 Presto。
unnest0.79版本添加
| 归档时间: |
|
| 查看次数: |
12786 次 |
| 最近记录: |