【问题标题】:Split Nested JSON into Equal Sized Files PySpark/Python将嵌套的 JSON 拆分为大小相等的文件 PySpark/Python
【发布时间】:2021-01-02 17:36:18
【问题描述】:

我正在使用 pyspark 生成如下所示的嵌套 json:

{
    "batch_key": 1,
    "client_key": 1,
    "client_name": "ABC",
       "Claims": [
        {
            "claim_key": "A",
            "client_key": "B",
            "client_name": "ATT"
           
        },
        {
            "claim_key": "B",
            "client_key": "B",
            "client_name": "ATT"
           
        }
    ]
}

但理想情况下,它应该被分成相等的部分,如下所示:

{
    "batch_key": 1,
    "client_key": 1,
    "client_name": "ABC",
       "Claims": [
        {
            "claim_key": "A",
            "client_key": "B",
            "client_name": "ATT"
           
        }
       
    ]
}


{
    "batch_key": 1,
    "client_key": 1,
    "client_name": "ABC",
       "Claims": [
        {
            "claim_key": "B",
            "client_key": "B",
            "client_name": "ATT"
           
        }
    ]
}

实际的 json 负载会大得多,因此需要进行上述拆分,以便 API 可以正确使用它。有没有办法使用 sparksql/pyspark/python 实现上述目标?

【问题讨论】:

  • 这个解决方案有效吗?

标签: python json apache-spark pyspark apache-spark-sql


【解决方案1】:

对于每个批次记录,您可以提取声明,map 覆盖声明以创建每个声明的多个批次,然后在结果上调用 flatten 到 flatten 结果。

例如,假设您有一个批次的流/RDD


batches = batches
.map( lambda batch :   [{
    "batch_key": batch[ "batch_key"],
    "client_key": batch["client_key"],
    "client_name": batch["client_name"],
    "Claims": [ claim ]
} for claim in batch["Claims"] ] )
.flatten()

根据您的 python 版本和您在每个 JSON 记录中拥有的属性/键的数量,您可以考虑在声明映射中合并或创建新字典的不同选项 - 请参阅 Merging dictionaries in Python 2 and 3

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多