使用 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 对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象
由于 PySpark 时间戳,将 Spark 数据帧保存到 Azure Synapse 时出现问题
无法通过 SSMS 访问 Azure Synapse Spark 表
Azure Synapse Analytics 是不是支持 R 语言?