【问题标题】:Is there any way to make a json key a field in redshift有没有办法让一个json键成为redshift中的一个字段
【发布时间】:2017-03-03 18:21:57
【问题描述】:

我基本上想获取“问题”中的所有键并为每个键分别记录。 假设我有看起来像这样的 json 数据:

"result": {
    "id": "dsgdsg",
    "name": "xxx",
    "expiration": {
        "startDate": null,
        "endDate": null
    },
    "questions": {
        "QID4": {
            "questionType": {
                "selector": "TB",
                "subSelector": null
            },
            "questionLabel": null,
            "validation": {
                "doesForceResponse": false
            }
        },
        "QID5": {
            "questionType": {
                "selector": "ML",
                "subSelector": null
            },
            "questionLabel": null,
            "validation": {
                "doesForceResponse": false
            }
        },
        "QID6": {
            "questionType": {
                "selector": "SAVR",
                "subSelector": "TX"
            },
            "questionLabel": null,
            "validation": {
                "doesForceResponse": false
            }

        },
        "QID7": {
            "questionType": {
                "selector": "SAVR",
                "subSelector": "TX"
            },
            "questionLabel": null,
            "validation": {
                "doesForceResponse": false
            }

        }

    }
    }

有没有办法使用 jsonpaths 将每个 QID 单独加载到具有自己记录的自己的字段中?我已经尝试过这样的事情:

    {
"jsonpaths": [
    "$.result.id",
    "$.result.name",
    "$.result.questions.[0]"
]
}

但这仅给出 QID4 内的数据,依此类推。我可以以某种方式遍历 jsonpaths 吗?

【问题讨论】:

  • 每个结果中是否有固定数量的问题...即所有结果都有问题 4-7?
  • 不,这是我的主要问题,每个结果都有不同数量的问题,所以我无法给出具体的最小值和最大值。
  • 我现在要做的基本上是使用python获取所有qid并在qid中创建一个包含该键的新字段。
  • 两步法? 1. 将整个 JSON 作为 VARCHAR 复制到一列,以及 2. 编写 UDF 以根据需要提取字段。
  • @rohitvk 我从未尝试过使用我目前正在研究的 UDF,如果您有任何与我正在尝试做的文档相近的文档,请链接我。非常感谢您的意见。

标签: json amazon-redshift jsonpath


【解决方案1】:

如果您可以在 Python 端对其进行更改,那将是最好的,这样每个 JSON 记录都是一个问题,如果需要,每个问题都包含结果信息。使用 jsonpaths,数据文件实际上不是有效的 JSON。它由单独的 JSON blob 组成,每条记录一个。

基于您的数据的两个此类记录的示例是:

{
    "qid" : "QID4",  "result_id" : "dsgdsg", "result_name": "xxx",
    "result_expiration": { "result_startDate": null, "result_endDate": null },
    "questionType": { "selector": "TB", "subSelector": null },
    "questionLabel": null,
    "validation": { "doesForceResponse": false }
}
{
    "qid" : "QID5",  "result_id" : "dsgdsg", "result_name": "xxx",
    "result_expiration": { "result_startDate": null, "result_endDate": null },
    "questionType": { "selector": "ML", "subSelector": null },
    "questionLabel": null,
    "validation": { "doesForceResponse": false }
}

请注意,两条记录之间没有逗号。

那么 jsonpaths 会是这样的:

{
"jsonpaths": [
    "$.qid",
    "$.result_name",
    "$.result_expiration.result_startDate",
    ...
]
}

如果这不可行,则可能有一种方法可以将整个“$.result.questions”元素作为 JSON 加载到暂存/临时表中的字段中,并使用 Redshift JSON functions 将其操作到最终表中。

【讨论】:

  • 感谢您的回复。我认为第一个例子可能是不可能的。我已经将问题加载到 redshift 中的一列中,我将研究您提供的 redshift json 函数。谢谢大家的帮助!
  • 其实你认为我可以遍历python中的数据并创建一个像这样的新字段,例如:“questions”:{“QID4”:{“questionType”:{“selector”: "TB", "subSelector": null }, "qid":QID4, "questionLabel": null, "validation": { "doesForceResponse": false } 在哪里我将 QID 4 附加到当前问题集中?
  • 我想我明白你的想法了。如果 JSON 中的每条记录都是问题之一,它可能会起作用。您只需要“QUID4”作为其中的值而不是键名,这样它就可以进入表列。你不需要任何结果头数据?
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2021-10-25
  • 2021-12-05
相关资源
最近更新 更多