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)
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 之间的转换
是的:toPandas
在您的数据帧上调用该方法,您将获得一个实际的熊猫数据帧!
正如@Brent在@maxymoo的答案评论中提到的那样,您可以尝试
df.limit(10).toPandas()
Run Code Online (Sandbox Code Playgroud)
在Jupyter中获得一张更漂亮的桌子。但是,如果不缓存spark数据帧,则可能需要花费一些时间。同样,.limit()
将不保留原始spark数据帧的顺序。