ChatGPT解决这个技术问题 Extra ChatGPT

如何在 PySpark 中查找 DataFrame 的大小或形状?

我试图找出 PySpark 中 DataFrame 的大小/形状。我没有看到可以做到这一点的单一功能。

在 Python 中,我可以这样做:

data.shape()

PySpark 中是否有类似的功能?这是我目前的解决方案,但我正在寻找一个元素

row_number = data.count()
column_number = len(data.dtypes)

列数的计算并不理想...

把它放在一个函数中?
您是指 NumPy 和 Pandas 的 data.shapeshape 不是函数。
什么不理想?我不确定您还想完成什么而不是您已经拥有的(除了用 data.columns 替换 data.dtypes,但这没什么区别)。

y
yatu

您可以通过以下方式获取其 shape

print((df.count(), len(df.columns)))

这对于分布在节点上的较大数据集是否可以正常工作?
为什么 Pyspark Dataframe 不像 pandas dataframe 使用 .shape 那样简单地存储形状值?对于这样一个常见且简单的操作,必须调用 count 似乎非常耗费资源。
T
Tshilidzi Mudau

使用 df.count() 获取行数。


L
Louis Yang

将此添加到您的代码中:

import pyspark
def spark_shape(self):
    return (self.count(), len(self.columns))
pyspark.sql.dataframe.DataFrame.shape = spark_shape

然后你可以做

>>> df.shape()
(10000, 10)

但请提醒您,对于尚未持久化的非常大的表,.count() 可能会非常慢。


V
Venzu251720
print((df.count(), len(df.columns)))

对于较小的数据集更容易。

但是,如果数据集很大,另一种方法是使用 pandas 和箭头将数据帧转换为 pandas df 并调用 shape

spark.conf.set("spark.sql.execution.arrow.enabled", "true")
spark.conf.set("spark.sql.crossJoin.enabled", "true")
print(df.toPandas().shape)

.toPandas 不是一个动作吗?意思:这不是要收集数据给你的master,然后在上面调用shape吗?如果是这样,那将是不可取的,除非你确定它会适合主人的记忆。
如果数据集很大,收集到 Pandas 正是你不想做的。顺便说一句:你为什么要为此启用交叉连接?箭头配置是否有助于收集到熊猫?
Y
YungChun

我认为 Spark 中没有类似 data.shape 的功能。但我会使用 len(data.columns) 而不是 len(data.dtypes)


这只是给你列数。行数呢?
S
Sahaj Raj Malla

我已经使用这个代码块解决了这个问题。请尝试一下,它有效。

import pyspark
def sparkShape(dataFrame):
    return (dataFrame.count(), len(dataFrame.columns))
pyspark.sql.dataframe.DataFrame.shape = sparkShape

print(<Input the Dataframe name which you want the output of>.shape())

这正是@Louis Yang 3 年前写的