在 Redshift 中解析一个 json 数组对象并转换为表格

Posted

技术标签:

【中文标题】在 Redshift 中解析一个 json 数组对象并转换为表格【英文标题】:Parse a json array object in Redshift and convert to table 【发布时间】:2015-09-17 23:09:03 【问题描述】:

是否可以解析此 JSON 数组并将其转换为表格并在 AWS Redshift 中执行此操作?

这个数组:

 [
  "Event":"start","EventDateTime":"2015-09-15T03:45:16.681428Z",
  "Event":"process","EventDateTime":"2015-09-15T03:45:16.681428Z",
  "Event":"end","EventDateTime":"2015-09-15T03:45:16.681428Z"
 ]

转换为包含 Event 和 EventDateTime 字段的表格。

我已经尝试了可用的 json 函数和字符串函数,结果都是空的。

谢谢!

【问题讨论】:

您是否尝试过使用 COPY 命令?你遇到了什么问题? 我使用 COPY 命令将完整的 json 文件加载到表中,并且上面的数组进入了一个字段,现在我正在尝试使用 Redshift 的可用功能解析该数据,但结果不足。 RS 的 json 函数对这个特定的数组没有帮助。除非我错过了什么。 您现在可以将 Python UDF 与 Redshift 一起使用,因此您的 SQL 现在应该更加灵活。 aws.amazon.com/blogs/aws/… 【参考方案1】:

要从 JSON 格式执行 Redshift COPY,您必须准备 JSON 数据结构。 The JSON data structure is made up of a set of objects or arrays.

在你的例子中:

    创建以下数据集并上传到 S3:

    "event":"start","eventdatetime":"2015-09-15T03:45:16.681428Z"
    "event":"process","eventdatetime":"2015-09-15T03:45:16.681428Z"
    "event":"end","eventdatetime":"2015-09-15T03:45:16.681428Z"
    

    在集群上创建表

    CREATE TABLE events (event VARCHAR, eventdatetime TIMESTAMP);
    

    运行复制命令

    COPY events FROM 's3://bucket/file' JSON 'auto' TIMEFORMAT 'auto' CREDENTIALS 'aws_access_key_id=???;aws_secret_access_key=???';
    

    测试结果

    SELECT * FROM events;
    

请记住,在此示例中将使用“自动”映射功能,因为column names are always lowercase, matching field names must also be lowercase.。 如果这不是一个选项,您可以使用JSONPaths file 来克服此限制。

【讨论】:

【参考方案2】:

您可以使用复制命令在 Redshift 中加载表,参考以下内容, http://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-copy-from-json.html

您在使用复制命令时遇到了什么问题,根据我的经验,它运行良好。

【讨论】:

【参考方案3】:

您的问题与 json 文档周围的方括号有关,如果您能够通过预处理删除那些方括号,您将能够使用复制命令来获取您需要的内容。

【讨论】:

以上是关于在 Redshift 中解析一个 json 数组对象并转换为表格的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中合并 JSON 数组中的元素

解析 JSON 时出错:输入中有多个文档(Redshift 到 Snowflake SQL)

在 Redshift 中的不同行上返回 JSON 数组列的元素

从 Amazon Redshift 中的 json 数组中提取特定键

如何在redshift上取消嵌套json字符串数组[重复]

JSON Redshift SQL - 遍历 json 数组