将一个Spark DataFrame转换为pandas DataFrame。

70
有没有一种方法可以将Spark DataFrame(而不是RDD)转换为pandas DataFrame?
我尝试了以下方法:
var some_df = Seq(
 ("A", "no"),
 ("B", "yes"),
 ("B", "yes"),
 ("B", "no")

 ).toDF(
"user_id", "phone_number")

代码:

%pyspark
pandas_df = some_df.toPandas()

错误:

 NameError: name 'some_df' is not defined

有什么建议。


5
Python变量不使用var关键字来声明。 - user3483203
@user3483203 是的,我用Spark和Scala解释器在笔记本中创建了数据框,并在尝试将DF转换为pandas DF时使用了'%pyspark'。 - data_person
2
为什么你要混用Scala和PySpark?只需要使用一个就可以了。 - Ramesh Maharjan
@RameshMaharjan 是的,我使用Scala。但是我正在尝试为Spark DF中的列构建可视化,但我找不到相关的资源。 - data_person
请查看http://blog.madhukaraphatak.com/statistical-data-exploration-spark-part-2/。 - Ramesh Maharjan
显示剩余5条评论
3个回答

94

以下内容应该有效

示例数据框

    some_df = sc.parallelize([
     ("A", "no"),
     ("B", "yes"),
     ("B", "yes"),
     ("B", "no")]
     ).toDF(["user_id", "phone_number"])

将DataFrame转换为Pandas DataFrame

    pandas_df = some_df.toPandas()

答案中的 toDF(...) 是一个转移注意点,为了清晰起见应该删除,我认为。它已经在问题中出现了。这就是为什么我更新了下面的答案。 - ijoseph
在这种情况下,“sc”代表什么? - Gabriel
2
@Gabriel 这是 Spark 上下文。 - Gaurang Shah
感谢您的回答。我尝试将此应用于我的pySpark 3.2.0代码中,但是我遇到了一个错误,即根据https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.SparkContext.parallelize.html,函数parallelize现在需要第二个参数c。尝试添加常量c .parallelize([ ("A", "no"), ("B", "yes"), ("B", "yes"), ("B", "no")], c=4)\ .toDF( ["user_id", "phone_number"] )结果出现另一个错误: AttributeError: 'list' object has no attribute 'defaultParallelism' - Curious Watcher

38

在我的情况下,以下的Spark DataFrame转换为Pandas DataFrame有效:

pandas_df = spark_df.select("*").toPandas()

9
除非您需要特定的列,否则在df上不需要使用select("*")。这不会影响性能,因为它是惰性执行并不会做任何事情。 - Gaurang Shah
2
由于某种原因,@Inna的解决方案是唯一在我的数据框上有效的。除非事先选择所有列,否则无法进行任何转换。数据类型与通常相同,但我之前应用了UDF。 - DataBach
我正在使用这个,但我的大多数Spark十进制列在Pandas中被转换为对象而不是浮点型。我有100多个列。是否有一种方法可以修改这种类型转换? - Resham Wadhwa
你可以编写一个函数并进行类型转换。 - Scope

15

如果你有一个大的数据框架,将Spark数据帧转换为Pandas可能需要很长时间。因此,你可以使用类似下面的东西:

df.toPandas()
spark.conf.set("spark.sql.execution.arrow.enabled", "true")

pd_df = df_spark.toPandas()

我已经在DataBricks中试过了。


spark.sql.execution.arrow.enabled”选项是强烈推荐的,特别是在即将发布的Spark 3.2版本中使用pyspark.pandas时。 - RndmSymbl
2
SQL配置项 'spark.sql.execution.arrow.enabled' 在Spark v3.0中已被弃用,未来可能会被移除。请使用 'spark.sql.execution.arrow.pyspark.enabled' 替代它。 - Gangadhar Kadam
1
请问您能否解释一下为什么这样更有效率? - notilas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接