2 回答

TA貢獻1155條經(jīng)驗 獲得超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 轉(zhuǎn)換為 Pandas DataFrame:
spark_df.toPandas() --> 利用 json_normalize() 然后恢復(fù)為 Spark DataFrame。
要恢復(fù)為 Spark DataFrame,您將使用spark.createDataFrame(pandas_df).
請注意,這種來回的解決方案并不理想,因為調(diào)用 toPandas() 會導(dǎo)致 DataFrame 的所有記錄都被收集 (.collect()) 到驅(qū)動程序,并且在處理更大的數(shù)據(jù)集時可能會導(dǎo)致內(nèi)存錯誤。
下面的鏈接提供了有關(guān)使用 toPandas() 的更多見解: DF.topandas() throwing error in pyspark
希望這會有所幫助,祝你好運!

TA貢獻2041條經(jīng)驗 獲得超4個贊
PySpark中沒有直接對應(yīng)的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|
+-----+-----+
如果您使用此答案中的遞歸“展平”函數(shù)構(gòu)建所有嵌套列的展平列表,那么我們將得到一個展平列結(jié)構(gòu):
columns = flatten(df.schema)
df.select(columns)
添加回答
舉報