簡體   English   中英

pyspark 數據框中是否有類似於 pandas.io.json.json_normalize 的函數

[英]Is there a function in pyspark dataframe that is similar to pandas.io.json.json_normalize

我想執行類似於 pandas.io.json.json_normalize 是 pyspark 數據幀的操作。 spark中有等效的功能嗎?

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.io.json.json_normalize.html

Spark 有一個類似的功能explode()但它並不完全相同。

這是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

希望這會有所幫助,祝你好運!

json_normalize中沒有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)

Pandas json_normalize() 非常棒,它在我的 Jupyter Notebook 中完美運行。 但是我在讓它與 Kafka Structured Streaming 一起運行時遇到了問題。 此解決方案是否也應與 Spark Streaming 一起使用,或者這是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM