PySpark 2.0 DataFrame的大小或形状

Xi *_*ang 53 size shape dataframe pyspark

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

在Python中,我可以做到

data.shape()
Run Code Online (Sandbox Code Playgroud)

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

row_number = data.count()
column_number = len(data.dtypes)
Run Code Online (Sandbox Code Playgroud)

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

Geo*_*her 68

print((df.count(), len(df.columns)))
Run Code Online (Sandbox Code Playgroud)

  • 为什么 Pyspark Dataframe 不像 pandas dataframe 使用“.shape”那样简单地存储形状值?对于这样一个常见且简单的操作来说,必须调用 count 似乎非常耗费资源。 (4认同)

VME*_*oli 42

使用df.count()获得的行数.


Lou*_*ang 9

将此添加到您的代码中:

def spark_shape(self):
    return (self.count(), len(self.columns))
pyspark.sql.dataframe.DataFrame.shape = spark_shape
Run Code Online (Sandbox Code Playgroud)

那你可以做

>>> df.shape()
(10000, 10)
Run Code Online (Sandbox Code Playgroud)

但请注意,.count()对于非常大的数据集,这可能会非常慢。

  • 我真的认为在没有正当理由的情况下更改 DataFrame API 是一个坏主意。只需调用“spark_shape(my_df)”...此外,可能将该函数命名为更清晰的名称,例如“compute_dataframe_shape”... (5认同)

小智 9

print((df.count(), len(df.columns)))
Run Code Online (Sandbox Code Playgroud)

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

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

spark.conf.set("spark.sql.execution.arrow.enabled", "true")
spark.conf.set("spark.sql.crossJoin.enabled", "true")
print(df.toPandas().shape)
Run Code Online (Sandbox Code Playgroud)

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

小智 4

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

  • 这只是给你列数。行数怎么样? (8认同)