【问题标题】:Mapping generic JSON field with Redshift Spectrum使用 Redshift Spectrum 映射通用 JSON 字段
【发布时间】:2019-09-06 08:25:13
【问题描述】:

我正在尝试将 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.

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

【问题讨论】:

    标签: hadoop amazon-redshift amazon-redshift-spectrum


    【解决方案1】:

    元数据字段它不是一个有效的 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 
    

    让我知道这是否适合你。

    【讨论】:

    • 感谢@mdem7 的回答。如果您使用 in struct 映射内部字段,您确实可以像您所说的那样查询 metadata 字段。问题是,在我的用例中,我事先并不知道这些字段。它们可以是任何东西,所以我需要将整个字段查询为varchar,以便在管道中进行进一步处理...
    • 无论如何,我认为这对 Athena 来说是可能的。我可以将metadata 字段定义为string,然后使用Athena/Presto JSON 函数对其进行查询。我认为在 Spectrum 中也可能有办法做到这一点。
    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2014-12-24
    • 2014-10-06
    • 2019-08-19
    相关资源
    最近更新 更多