为了账号安全,请及时绑定邮箱和手机立即绑定

pyspark 数据框中是否有类似于 pandas.io.json.json_normalize

pyspark 数据框中是否有类似于 pandas.io.json.json_normalize

BIG阳 2022-07-05 17:04:47
我想执行类似于 pandas.io.json.json_normalize 的操作是 pyspark 数据帧。spark中是否有等效功能?https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.io.json.json_normalize.html
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

Spark 具有类似的功能explode(),但并不完全相同。


这是爆炸在非常高的水平上的工作方式。


>>> from pyspark.sql.functions import explode, col


>>> data = {'A': [1, 2]}


>>> df = spark.createDataFrame(data)


>>> df.show()

 +------+

 |     A|

 +------+

 |[1, 2]|

 +------+


>>> df.select(explode(col('A')).alias('normalized')).show()

+----------+

|normalized|

+----------+

|         1|

|         2|

+----------+

另一方面,您可以使用以下方法将 Spark DataFrame 转换为 Pandas DataFrame:


spark_df.toPandas() --> 利用 json_normalize() 然后恢复为 Spark DataFrame。


要恢复为 Spark DataFrame,您将使用spark.createDataFrame(pandas_df).


请注意,这种来回的解决方案并不理想,因为调用 toPandas() 会导致 DataFrame 的所有记录都被收集 (.collect()) 到驱动程序,并且在处理更大的数据集时可能会导致内存错误。


下面的链接提供了有关使用 toPandas() 的更多见解: DF.topandas() throwing error in pyspark


希望这会有所帮助,祝你好运!


查看完整回答
反对 回复 2022-07-05
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

PySpark中没有直接对应的json_normalize。但 Spark 提供了不同的选择。如果您在这样的 Dataframe 中有嵌套对象


one

|_a

|_..

two

|_b

|_..

您可以在 Spark 中选择子列,如下所示:


import pyspark

from pyspark.sql.session import SparkSession

spark = SparkSession.builder.appName("stackoverflow demo").getOrCreate()

columns = ['id', 'one', 'two']

vals = [

     (1, {"a": False}, {"b": True}),

     (2, {"a": True}, {"b": False})

]

df = spark.createDataFrame(vals, columns)

df.select("one.a", "two.b").show()

+-----+-----+

|    a|    b|

+-----+-----+

|false| true|

| true|false|

+-----+-----+

如果您使用此答案中的递归“展平”函数构建所有嵌套列的展平列表,那么我们将得到一个展平列结构:


columns = flatten(df.schema)

df.select(columns)


查看完整回答
反对 回复 2022-07-05
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号