spark数据帧的分区数?

Posted

技术标签:

【中文标题】spark数据帧的分区数?【英文标题】:Number of partitions of a spark dataframe? 【发布时间】:2020-06-15 19:46:50 【问题描述】:

我有一个 spark 数据框(Spark 2.3),它存储了一个零记录的 sql。当我尝试计算分区数时,它没有显示任何结果并尝试了各种函数,例如 df.rdd.getNumPartitions / df.rdd.getNumPartitions()/ df.rdd.length / df.rdd.partitions.size。

如何从具有零或数百万条记录的 spark 数据帧中获取分区数?

代码:

empsql = 'Select * From Employee' ## In this sql it has zero records
df = spark.sql(empsql) ##Spark is configured
df.rdd.getNumPartitions

#Using df.rdd.partitions.size got error as: AttributeError: 'RDD' object has no attribute 'partitions'

【问题讨论】:

我猜是pyspark @thebluephantom 是的。它是 pyspark 请尝试回答... 【参考方案1】:

尝试,假设 pyspark:

df.rdd.getNumPartitions()

通过应该等同于空查询的空 DF 进行模拟:

from pyspark.sql.types import *
field = [StructField("FIELDNAME_1",StringType(), True),StructField("FIELDNAME_2", StringType(), True),  StructField("FIELDNAME_3", StringType(), True)]
schema = StructType(field)
df = sqlContext.createDataFrame(sc.emptyRDD(), schema)
df.rdd.getNumPartitions()

返回:

Out[6]: 0

此外:

df.registerTempTable('XXX')
yyy = spark.sql("select * from XXX")
yyy.rdd.getNumPartitions()

产量:

Out[11]: 0

【讨论】:

我试过 df.rdd.getNumPartitions() 并没有得到任何结果。在第二个解决方案中,我有 SQL,它有 145 列。 神秘。对我来说效果很好。 再次检查。它应该独立于源代码。【参考方案2】:

零记录的数据帧的分区数取决于 SparkSession 对象的实例化方式。

如果我使用下面给出的配置构建 SparkSession 对象,我最终会为一个数据帧获得 4 个分区,即使它有零记录。

Scala 代码 sn-p 来证明这一点 -

val spark = SparkSession.builder()
    .appName(this.getClass.getName)
    .config("spark.master", "local[4]").getOrCreate()

import org.apache.spark.sql.types._

val data = Seq(("first","row"),("second","row"))

val df = spark.createDataFrame(spark.sparkContext.parallelize(data))

val zeroRowDF = df.filter(col("_1") === lit(“third”))

zeroRowDF.count —> it returns ZERO

zeroRowDF.rdd.getNumPartitions —> it returns 4

【讨论】:

以上是关于spark数据帧的分区数?的主要内容,如果未能解决你的问题,请参考以下文章

获取分区镶木地板数据帧的最新模式

获取 Spark 写入 Hive 元存储的所有新分区

Spark parquet 数据帧分区数

如何使用 pyspark 管理跨集群的数据帧的物理数据放置?

spark数据分区数量的原理

Spark DataFrame重新分区:未保留的分区数