Pyspark:以 table 格式显示 spark 数据框
Pyspark: display a spark data frame in a table format
我正在使用 pyspark 读取如下所示的 parquet 文件:
my_df = sqlContext.read.parquet('hdfs://myPath/myDB.db/myTable/**')
然后当我执行 my_df.take(5)
时,它将显示 [Row(...)]
,而不是像我们使用 pandas 数据框时那样的 table 格式。
是否可以像 pandas 数据框那样以 table 格式显示数据框?谢谢!
是:在您的数据帧上调用 toPandas
方法,您将获得一个 actual pandas 数据帧!
show 方法可以满足您的需求。
例如,给定以下 3 行数据框,我可以像这样只打印前两行:
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("baz", 3)], ('k', 'v'))
df.show(n=2)
产生:
+---+---+
| k| v|
+---+---+
|foo| 1|
|bar| 2|
+---+---+
only showing top 2 rows
正如@brent在@maxymoo的回答的评论中提到的,你可以试试
df.limit(10).toPandas()
在 Jupyter 中获得更漂亮的 table。但是,如果您不缓存 spark 数据帧,这可能需要一些时间 运行。此外,.limit()
不会保留原始 spark 数据帧的顺序。
假设我们有以下 Spark DataFrame:
df = sqlContext.createDataFrame(
[
(1, "Mark", "Brown"),
(2, "Tom", "Anderson"),
(3, "Joshua", "Peterson")
],
('id', 'firstName', 'lastName')
)
通常可以使用三种不同的方式打印数据框的内容:
打印 Spark DataFrame
最常用的方法是使用show()
函数:
>>> df.show()
+---+---------+--------+
| id|firstName|lastName|
+---+---------+--------+
| 1| Mark| Brown|
| 2| Tom|Anderson|
| 3| Joshua|Peterson|
+---+---------+--------+
垂直打印 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
转换为Pandas并打印Pandas DataFrame
或者,您可以使用 .toPandas()
and finally print()
将 Spark DataFrame 转换为 Pandas DataFrame。
>>> df_pd = df.toPandas()
>>> print(df_pd)
id firstName lastName
0 1 Mark Brown
1 2 Tom Anderson
2 3 Joshua Peterson
请注意,当您必须处理相当大的数据帧时,不建议这样做,因为 Pandas 需要将所有数据加载到内存中。如果是这种情况,以下配置将有助于将大型 spark 数据帧转换为 pandas 数据帧:
spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true")
更多细节可以参考我的博客post Speeding up the conversion between PySpark and Pandas DataFrames
如果您使用的是 Jupyter,这对我有用:
[1]
df= spark.read.parquet("s3://df/*")
[2]
dsp = 用户
[3]
%%展示
数字信号处理器
这个格式很好 HTML table,你也可以直接在上面画一些简单的图表。有关 %%display 的更多文档,请键入 %%help。
也许这样的东西更优雅一点:
df.display()
# OR
df.select('column1').display()
默认情况下show()函数打印DataFrame的20条记录。您可以通过向 show() 函数提供参数来定义要打印的行数。你永远不知道,DataFrame 的总行数是多少。因此,我们可以将 df.count() 作为参数传递给 show 函数,它将打印 DataFrame 的所有记录。
df.show() --> prints 20 records by default
df.show(30) --> prints 30 records according to argument
df.show(df.count()) --> get total row count and pass it as argument to show
我正在使用 pyspark 读取如下所示的 parquet 文件:
my_df = sqlContext.read.parquet('hdfs://myPath/myDB.db/myTable/**')
然后当我执行 my_df.take(5)
时,它将显示 [Row(...)]
,而不是像我们使用 pandas 数据框时那样的 table 格式。
是否可以像 pandas 数据框那样以 table 格式显示数据框?谢谢!
是:在您的数据帧上调用 toPandas
方法,您将获得一个 actual pandas 数据帧!
show 方法可以满足您的需求。
例如,给定以下 3 行数据框,我可以像这样只打印前两行:
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("baz", 3)], ('k', 'v'))
df.show(n=2)
产生:
+---+---+
| k| v|
+---+---+
|foo| 1|
|bar| 2|
+---+---+
only showing top 2 rows
正如@brent在@maxymoo的回答的评论中提到的,你可以试试
df.limit(10).toPandas()
在 Jupyter 中获得更漂亮的 table。但是,如果您不缓存 spark 数据帧,这可能需要一些时间 运行。此外,.limit()
不会保留原始 spark 数据帧的顺序。
假设我们有以下 Spark DataFrame:
df = sqlContext.createDataFrame(
[
(1, "Mark", "Brown"),
(2, "Tom", "Anderson"),
(3, "Joshua", "Peterson")
],
('id', 'firstName', 'lastName')
)
通常可以使用三种不同的方式打印数据框的内容:
打印 Spark DataFrame
最常用的方法是使用show()
函数:
>>> df.show()
+---+---------+--------+
| id|firstName|lastName|
+---+---------+--------+
| 1| Mark| Brown|
| 2| Tom|Anderson|
| 3| Joshua|Peterson|
+---+---------+--------+
垂直打印 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
转换为Pandas并打印Pandas DataFrame
或者,您可以使用 .toPandas()
and finally print()
将 Spark DataFrame 转换为 Pandas DataFrame。
>>> df_pd = df.toPandas()
>>> print(df_pd)
id firstName lastName
0 1 Mark Brown
1 2 Tom Anderson
2 3 Joshua Peterson
请注意,当您必须处理相当大的数据帧时,不建议这样做,因为 Pandas 需要将所有数据加载到内存中。如果是这种情况,以下配置将有助于将大型 spark 数据帧转换为 pandas 数据帧:
spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true")
更多细节可以参考我的博客post Speeding up the conversion between PySpark and Pandas DataFrames
如果您使用的是 Jupyter,这对我有用:
[1] df= spark.read.parquet("s3://df/*")
[2] dsp = 用户
[3] %%展示 数字信号处理器
这个格式很好 HTML table,你也可以直接在上面画一些简单的图表。有关 %%display 的更多文档,请键入 %%help。
也许这样的东西更优雅一点:
df.display()
# OR
df.select('column1').display()
默认情况下show()函数打印DataFrame的20条记录。您可以通过向 show() 函数提供参数来定义要打印的行数。你永远不知道,DataFrame 的总行数是多少。因此,我们可以将 df.count() 作为参数传递给 show 函数,它将打印 DataFrame 的所有记录。
df.show() --> prints 20 records by default
df.show(30) --> prints 30 records according to argument
df.show(df.count()) --> get total row count and pass it as argument to show