使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象

Posted

技术标签:

【中文标题】使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象【英文标题】:Using Azure Synapse pyspark filter flatten the nested json objects based on nested object's data type 【发布时间】: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() 将线数据类型视为结构。 【参考方案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 数据。希望你有我的问题。

以上是关于使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象的主要内容,如果未能解决你的问题,请参考以下文章