Pyspark:以表格格式显示火花数据框

Eda*_*ame 24 python pandas pyspark spark-dataframe

我正在使用pyspark来阅读下面的镶木地板文件:

my_df = sqlContext.read.parquet('hdfs://myPath/myDB.db/myTable/**')
Run Code Online (Sandbox Code Playgroud)

然后,当我这样做时my_df.take(5),它将显示[Row(...)],而不是像我们使用pandas数据帧时的表格格式.

是否可以以pandas数据帧等表格格式显示数据帧?谢谢!

edd*_*ies 37

节目的方法做,你在找什么.

例如,给定以下3行的数据帧,我可以打印前两行,如下所示:

df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("baz", 3)], ('k', 'v'))
df.show(n=2)
Run Code Online (Sandbox Code Playgroud)

产量:

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|bar|  2|
+---+---+
only showing top 2 rows
Run Code Online (Sandbox Code Playgroud)

  • 它是v primitive与`pandas`:例如,对于包装它不允许水平滚动 (4认同)

Gio*_*ous 20

假设我们有以下 Spark DataFrame:

df = sqlContext.createDataFrame(
    [
        (1, "Mark", "Brown"), 
        (2, "Tom", "Anderson"), 
        (3, "Joshua", "Peterson")
    ], 
    ('id', 'firstName', 'lastName')
)
Run Code Online (Sandbox Code Playgroud)

通常可以使用三种不同的方式来打印数据框的内容:

打印 Spark 数据帧

最常见的方法是使用show()函数:

>>> df.show()
+---+---------+--------+
| id|firstName|lastName|
+---+---------+--------+
|  1|     Mark|   Brown|
|  2|      Tom|Anderson|
|  3|   Joshua|Peterson|
+---+---------+--------+
Run Code Online (Sandbox Code Playgroud)

垂直打印 Spark DataFrame

假设您有相当多的列并且您的数据框不适合屏幕。您可以垂直打印行 - 例如,以下命令将垂直打印前两行,不会被截断。

>>> df.show(n=2, truncate=False, vertical=True)
-RECORD 0-------------
 id        | 1        
 firstName | Mark     
 lastName  | Brown    
-RECORD 1-------------
 id        | 2        
 firstName | Tom      
 lastName  | Anderson 
only showing top 2 rows
Run Code Online (Sandbox Code Playgroud)

转换为 Pandas 并打印 Pandas DataFrame

或者,您可以使用.toPandas()并最终将 Spark DataFrame 转换为 Pandas DataFrame print()

>>> df_pd = df.toPandas()
>>> print(df_pd)
   id firstName  lastName
0   1      Mark     Brown
1   2       Tom  Anderson
2   3    Joshua  Peterson
Run Code Online (Sandbox Code Playgroud)

请注意,当您必须处理相当大的数据帧时,不建议这样做,因为 Pandas 需要将所有数据加载到内存中。如果是这种情况,以下配置将有助于将大型 spark 数据帧转换为 Pandas 数据帧:

spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true")
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,您可以参考我的博客文章加速 PySpark 和 Pandas DataFrames 之间的转换


max*_*moo 8

是的:toPandas在您的数据帧上调用该方法,您将获得一个实际的熊猫数据帧!

  • 它应该与限制一起使用,例如 df.limit(10).toPandas() 以防止 OOM (12认同)
  • 这是危险的,因为这会将整个数据帧收集到单个节点中。 (9认同)
  • 需要强调的是,这会在传统的 Spark RDD 场景中快速耗尽内存。 (2认同)

Lou*_*ang 7

正如@Brent在@maxymoo的答案评论中提到的那样,您可以尝试

df.limit(10).toPandas()
Run Code Online (Sandbox Code Playgroud)

在Jupyter中获得一张更漂亮的桌子。但是,如果不缓存spark数据帧,则可能需要花费一些时间。同样,.limit()将不保留原始spark数据帧的顺序。

  • 如果您使用“toPandas()”,请考虑启用 PyArrow 优化:https://medium.com/@giorgosmyrianthous/how-to-efficiently-convert-a-pyspark-dataframe-to-pandas-8bda2c3875c3 (3认同)