在 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 数组对象并转换为表格的主要内容,如果未能解决你的问题,请参考以下文章
解析 JSON 时出错:输入中有多个文档(Redshift 到 Snowflake SQL)
在 Redshift 中的不同行上返回 JSON 数组列的元素