【问题标题】:Using Azure Synapse pyspark filter flatten the nested json objects based on nested object's data type使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象
【发布时间】:2021-12-30 06:17:40
【问题描述】:

我正在使用 Azure Synapse pyspark 来扁平化嵌套的 json 数据。 json 文件包含带有嵌套数据的 json 对象,如下所示,这里的 cords 是第 1 条和第 3 条记录的 struct 类型和第 2 条记录的字符串类型。 当我使用 df.printSchema() 打印模式时,它会将线类型打印为字符串,如果我删除第二行 json 对象,那么它会打印结构类型的模式。 在这里,我想根据 cords 数据类型过滤 json 对象,以便我可以展平 cords 结构嵌套数据。至于第二个记录展平不是 必需的。请问有人可以帮我吗?

{"dateTime":"2020-11-29T13:51:16.168659Z","cords":{"x_al":0.0191342489,"y_al":-0.1200904993}}

{"dateTime":"2020-12-29T13:51:21.457739Z","cords":51.0}

{"dateTime":"2021-10-29T13:51:26.634289Z","cords":{"x_al":0.01600042489,"y_al":-0.1200900993}}

【问题讨论】:

  • 您的预期结果是什么?你都尝试了些什么?如果您提供一个工作示例,创建一个数据框,添加数据以使人们更容易工作,那就更好了。
  • @wBob 谢谢你的回复。目标是从源文件中提取 json 数据并展平其所有嵌套的 json 数据。源文件有大量复杂的数据,上面的 json 数据只是它的一部分样本。在源文件中,很少有 json 对象具有像 "cords":51.0 这样的值,因此 df.printSchema() 将线数据类型视为字符串,因此我无法展平线数据。仅出于测试目的,我将第一行和第二行 json 对象复制到单独的 valid.json 文件中,从 valid.json 文件中展平嵌套数据就像一个魅力,因为 df.printSchema() 将线数据类型视为结构。

标签: json pyspark azure-synapse nested-json


【解决方案1】:

您可以将 pandas 导入到您的代码中,然后它们会使用它加载数据,如下所示:

df = pd.DataFrame([flatten_json(data)])

从上面的代码行中,我们假设“数据”是存储 JSON 结构化数据的变量。

此外,我们在关于您的三种 json 类型的数据中有多种方案。

  • 如果你只有一个字典,那么你可以使用flatten_json(data)
  • 如果你有多个像[{},{}.{}]这样的字典,那么你可以使用[flatten_json(x) for x in data]
  • 如果您有多个值,例如{1: {}, 2: {}, 3: {}},那么您应该使用[flatten_json(data[key]) for key in data.keys()]

为了更好地理解 Pyspark,请参阅blog,感谢向数据科学的清晰解释。

【讨论】:

  • 感谢您的回复,正如上面我的 cmets 部分所述。如果 "cords":51.0 没有任何这个标量值,使用普通的 pyspark 代码我可以成功地展平嵌套的 json 数据。希望你有我的问题。
猜你喜欢
  • 2020-03-11
  • 2012-11-15
  • 2021-10-19
  • 2012-05-29
  • 1970-01-01
  • 2019-01-26
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多