ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 pyspark 读取如下镶木地板文件:

my_df = sqlContext.read.parquet('hdfs://myPath/myDB.db/myTable/**')

然后当我执行 my_df.take(5) 时,它会显示 [Row(...)],而不是像我们使用 pandas 数据框时那样的表格格式。

是否可以像熊猫数据框一样以表格格式显示数据框?谢谢!

试试这个:my_df.take(5).show()
我收到错误: in () ----> my_df.take(5).show() AttributeError: 'list' object has no attribute 'show'
它应该是 my_df.show().take(5)
@MaxU .take(5).show() 与 .show(5) 有何不同?它更快吗?
my_df.show(5) #5 是行数。

e
eddies

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 原始 vs pandas:例如对于包装它不允许水平滚动
谢谢你的回答!但是,链接似乎被破坏了。
感谢您的提醒。更新了指向新文档位置的链接
L
Louis Yang

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

df.limit(10).toPandas()

在 Jupyter 中获得更漂亮的表。但是,如果您不缓存 spark 数据帧,这可能需要一些时间来运行。此外,.limit() 不会保持原始 spark 数据帧的顺序。


如果您使用 toPandas(),请考虑启用 PyArrow 优化:medium.com/@giorgosmyrianthous/…
G
Giorgos Myrianthous

假设我们有以下 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() 将 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

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

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

更多详情可以参考我的博文Speeding up the conversion between PySpark and Pandas DataFrames


m
maxymoo

是的:在您的数据框上调用 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() 以防止 OOM
使用 .toPandas(),我收到以下错误:调用 o86.get 时发生错误。 : java.util.NoSuchElementException: spark.sql.execution.pandas.respectSessionTimeZone 我该如何处理?
H
Hubert

如果您使用的是 Jupyter,这对我有用:

[1] df= spark.read.parquet("s3://df/*")

[2] dsp = 用户

[3] %%显示 dsp

这显示了格式良好的 HTML 表格,您也可以直接在其上绘制一些简单的图表。有关 %%display 的更多文档,请键入 %%help。


b
bhargav3vedi

默认情况下 show() 函数打印 20 条 DataFrame 记录。您可以通过向 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

M
Marc88

也许像这样的东西更优雅一点:

df.display()
# OR
df.select('column1').display()

display 不是一个函数,PySpark 提供了 head、tail、show 等函数来显示数据帧。
请重新阅读问题。答案很好。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅