【问题标题】:Presto Produce JSON resultsPresto 生成 JSON 结果
【发布时间】:2021-04-04 10:43:51
【问题描述】:

我有一个由

创建的 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"}

这可能吗?

*编辑这个查询给了我以下结果:

SELECT CAST(column3 AS JSON) as column3_json
FROM normaldata_source

【问题讨论】:

  • 有一些解决方法(例如,使用格式函数构建字符串),github.com/trinodb/trino/pull/3613 正在进行对带有字段名称的 json 的支持。
  • 感谢您的信息。不幸的是,我的真实对象有很多字段并且是嵌套的,因此使用格式函数构建字符串将非常繁琐。我希望有一个更简单的方法。链接是 trino 的,但这和 presto 是一样的吗?
  • 是的,trino.io/blog/2020/12/27/announcing-trino.html 是相关的博文。

标签: sql json presto trino


【解决方案1】:

我遇到了同样的问题,并且完全不知道如何根据深层组合嵌套/结构进行操作。我正在使用 Athena(来自 AWS 的带有 Hive 连接器的托管 Presto)。最后,我通过执行 CTAS(创建表作为选择)解决了这个问题,在我想要的条件下,我选择了我想要的复杂列)并将其写入具有 JSON 的基础 SerDe 格式的外部表。然后,通过 HiveConnector 的 $path 魔术列(或通过在外部表位置下列出文件),我获得了结果文件并从中流出。

我知道这不是手头问题的直接答案 - 我相信我们必须等待 https://github.com/trinodb/trino/pull/3613 才能支持任意结构/数组组合 -> json。但也许这会帮助那些认为他们能够做到这一点的人。

虽然我最初认为这是一个烦人的解决方法,但我现在开始认为这对我的应用程序来说是正确的选择

【讨论】:

  • 能否分享一个您实施的可重现示例?我现在完全被这个问题困住了!
【解决方案2】:

Trino 357 (formerly known as Presto SQL) 开始,您现在可以将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

=>

      _col0
-----------------
 {"column4":"Y"}
(1 row)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多