【问题标题】:Why is it not possible to determine the partitions in a dataframe if it is possible to get the count of partitions in Spark?如果可以获取 Spark 中的分区数,为什么无法确定数据帧中的分区?
【发布时间】:2020-10-07 15:42:51
【问题描述】:

使用df.rdd.getNumPartitions(),我们可以得到分区的数量。但是我们如何获得分区呢?

我还尝试从文档和数据框的所有属性(使用dir(df))中获取一些信息。但是,我找不到任何可以提供分区的 API,我只能找到 repartitioningcoalescegetNumPartitions

我阅读了this 并推断出 Spark 不知道分区键。我的疑问是,如果它不知道分区键,因此不知道分区,它怎么知道它们的计数?如果可以,如何确定分区?

【问题讨论】:

  • 确定分区是什么意思?内容、方法?分区号?
  • 很抱歉无法为您提供准确的答案。 “分区”是指数据被分区的文件夹。例如,created_month * 12 个文件夹,每个文件夹包含 created_day * 30 个(几乎)文件夹,然后将文件存储在每个 day 文件夹中。有意义吗?
  • 不,因为数据帧在内存中,可能会被驱逐到磁盘,但听起来你的意思是当数据帧写入磁盘时。那是静止的数据,确实不同。
  • 我对您阅读的数据和您期望的结果感到困惑。你能澄清一下吗?您可以使用 partitions() 方法获取分区,如:spark.apache.org/docs/latest/api/java/org/apache/spark/rdd/…
  • @jpg 当我输入 df.rdd.partitions 时,我得到:AttributeError: 'RDD' object has no attribute 'partitions'

标签: python apache-spark pyspark


【解决方案1】:

如何使用mapPartitionsWithIndex检查分区包含的内容

此代码适用于一些小型数据集

def f(splitIndex, elements): 
  elements_text = ",".join(list(elements))
  yield splitIndex, elements_text

rdd.mapPartitionsWithIndex(f).take(10)

【讨论】:

    【解决方案2】:

    pyspark 提供 spark_partition_id() 函数。

    spark_partition_id()

    分区 ID 列。

    注意:这是不确定的,因为它取决于数据分区 和任务调度。

    >>> from pyspark.sql.functions import *
    >>> spark.range(1,1000000)
          .withColumn("spark_partition",spark_partition_id())
          .groupby("spark_partition")
          .count().show(truncate=False)
    +---------------+------+
    |spark_partition|count |
    +---------------+------+
    |1              |500000|
    |0              |499999|
    +---------------+------+
    

    分区从零到n-1 编号,其中n 是您从getNumPartitions() 获得的编号。

    这就是你所追求的吗?或者您的意思是 Hive 分区?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 2019-09-12
      相关资源
      最近更新 更多