hadoop - 使用 Redshift Spectrum 映射通用 JSON 字段

标签 hadoop amazon-redshift amazon-redshift-spectrum

我正在尝试将 Redshift Spectrum 中的变量类型 JSON 字段转换为平面字符串,但不断收到 column type VARCHAR for column STRUCT is incompatible .

我试图查询的 JSON 数据有几个字段,这些字段的结构是固定的和预期的。但是,有一个字段包含元数据,它是一个没有特定格式的 JSON(任何内容都是有效的)。例如:

{"fixed_integer": 1, "fixed_date": "2019-01-01", "metadata": {"one": "two", "three": 4}}
{"fixed_integer": 1, "fixed_date": "2019-01-01", "metadata": {"five": [1, 2], "six": false}}

我可以将代码与 DDL 映射为

CREATE EXTERNAL TABLE my_data(
 fixed_integer int,
 fixed_date varchar,
 metadata varchar
)

没有提示,但是当我尝试使用简单的 SELECT metadata FROM my_data 查询数据时我明白了
declared column type VARCHAR for column STRUCT is incompatible .

到目前为止,我找不到解决方法。
有没有人遇到过这个或类似的问题?

最佳答案

元数据字段不是有效的 varchar,要成为有效的 varchar 字段,它应该如下所示
"metadata": '{"one": "two", "three": 4}}'
这不是正确的 json 格式

我认为如果您使用元数据作为结构创建外部表,您可以查询它

CREATE EXTERNAL TABLE my_data(
 fixed_integer int,
 fixed_date varchar,
 metadata struct <details:varchar(4000)>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties (
'dots.in.keys' = 'true',
 as location '<s3 location>'

在查询元数据字段时,您需要指定 .
SELECT metadata.details FROM my_data 

让我知道这是否适合您。

关于hadoop - 使用 Redshift Spectrum 映射通用 JSON 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57818334/

相关文章:

hadoop - 如何从 Hive Beeline 中找到默认 HDFS 目录及其内容?

amazon-redshift - SQL Server isNumeric() 在 amazon redshift 中等效

postgresql:合并行保留一些信息,没有循环

scala - 在我的用例中通过高效使用 Spark 或 pig 组?

hadoop - Spark Thriftserver 未连接到正确的 Hive 数据库

amazon-web-services - 检查 Redshift 中用户的 "CONNECTION LIMIT"

json - 从 AWS Glue 表到 RedShift Spectrum 外部表的日期字段转换

hadoop - 如果hadoop集群配置为利用kerberos身份验证,那么是否需要配置MapReduce作业来处理它?

amazon-web-services - 从 Kafka 读取数据到 AWS Redshift 的最佳实践