Pyspark:以表格格式显示火花数据框
Posted
技术标签:
【中文标题】Pyspark:以表格格式显示火花数据框【英文标题】:Pyspark: display a spark data frame in a table format 【发布时间】:2016-08-21 18:24:58 【问题描述】:我正在使用 pyspark 读取如下镶木地板文件:
my_df = sqlContext.read.parquet('hdfs://myPath/myDB.db/myTable/**')
然后当我执行my_df.take(5)
时,它会显示[Row(...)]
,而不是像我们使用pandas 数据框时那样的表格格式。
是否可以像熊猫数据框一样以表格格式显示数据框?谢谢!
【问题讨论】:
试试这个:my_df.take(5).show()
我得到错误:my_df.show().take(5)
@MaxU .take(5).show() 与 .show(5) 有何不同?它更快吗?
my_df.show(5) #5 是行数。
【参考方案1】:
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
【讨论】:
这是 v 原始 vspandas
:例如用于包装它不允许水平滚动
感谢您的回答!但是,链接似乎已损坏。
感谢您的提醒。更新了指向新文档位置的链接【参考方案2】:
正如@Brent 在@maxymoo 的回答的评论中提到的,你可以试试
df.limit(10).toPandas()
在 Jupyter 中获得更漂亮的表格。但是,如果您不缓存 spark 数据帧,这可能需要一些时间才能运行。另外,.limit()
不会保持原始 spark 数据帧的顺序。
【讨论】:
如果您使用的是toPandas()
,请考虑启用 PyArrow 优化:medium.com/@giorgosmyrianthous/…【参考方案3】:
假设我们有以下 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()
和最后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")
更多详情可以参考我的博文Speeding up the conversion between PySpark and Pandas DataFrames
【讨论】:
【参考方案4】:是的:在您的数据框上调用toPandas
方法,您将获得一个实际熊猫数据框!
【讨论】:
我试着做:my_df.toPandas().head()。但是得到了错误:Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe。 :org.apache.spark.SparkException:作业因阶段失败而中止:阶段 2.0 中的任务 301 失败 1 次,最近一次失败:阶段 2.0 中丢失任务 301.0(TID 1871,本地主机):java.lang.OutOfMemoryError:Java 堆空间 这很危险,因为这会将整个数据框收集到单个节点中。 需要强调的是,在传统的 Spark RDD 场景中,这会很快耗尽内存。 它应该与限制一起使用,例如 df.limit(10).toPandas() 以防止 OOMs 使用 .toPandas(),我收到以下错误:调用 o86.get 时出错。 : java.util.NoSuchElementException: spark.sql.execution.pandas.respectSessionTimeZone 我该如何处理?【参考方案5】:如果您使用的是 Jupyter,这对我有用:
[1] df= spark.read.parquet("s3://df/*")
[2] dsp = 用户
[3] %%展示 dsp
这显示了格式良好的 html 表格,您也可以直接在其上绘制一些简单的图表。有关 %%display 的更多文档,请输入 %%help。
【讨论】:
【参考方案6】:也许这样的东西更优雅一点:
df.display()
# OR
df.select('column1').display()
【讨论】:
以上是关于Pyspark:以表格格式显示火花数据框的主要内容,如果未能解决你的问题,请参考以下文章