问题描述
创建的json表
CREATE TABLE `normaldata_source`(
`column1` int,`column2` string,`column3` struct<column4:string>)
示例数据是:
{
"column1": 9,"column2": "Z","column3": {
"column4": "Y"
}
}
如果我这样做
SELECT column3
FROM normaldata_source
它会产生一个结果 {column4=y}
。但是,我希望它采用 json 形式 {"column4": "y"}
这可能吗?
*Edit 这个查询给了我以下结果:
SELECT CAST(column3 AS JSON) as column3_json
FROM normaldata_source
解决方法
我遇到了同样的问题,并且对于如何根据深层组合嵌套/结构进行处理感到非常困惑。我正在使用 Athena(来自 AWS 的带有 Hive 连接器的托管 Presto)。最后,我通过执行 CTAS(创建表作为选择)来解决它,在我想要的条件下,我选择了我想要的复杂列)并将其写入具有 JSON 基础 SerDe 格式的外部表。然后,通过 HiveConnector 的 $path 魔法列(或通过列出外部表位置下的文件),我获得结果文件并从中流出。
我知道这不是手头问题的直接答案 - 我相信我们必须等待 https://github.com/trinodb/trino/pull/3613 才能支持任意结构/数组组合 -> json。但也许这会帮助那些认为他们能够做到这一点的其他人。
虽然我最初认为这是一个烦人的解决方法,但我现在开始认为无论如何这是对我的应用程序的正确调用
,从 Trino 357 (formerly known as Presto SQL) 开始,您现在可以将 mysite
强制转换为 row
,它会保留列名:
JSON
=>
WITH normaldata_source(column1,column2,column3) AS (
VALUES (9,'Z',cast(row('Y') as row(column4 varchar)))
)
SELECT cast(column3 as json)
FROM normaldata_source