【发布时间】:2018-11-05 18:39:13
【问题描述】:
我想知道 Spark 是否知道 parquet 文件的分区键并使用此信息来避免洗牌。
上下文:
运行 Spark 2.0.1 运行本地 SparkSession。我有一个 csv 数据集,我将其保存为磁盘上的 parquet 文件,如下所示:
val df0 = spark
.read
.format("csv")
.option("header", true)
.option("delimiter", ";")
.option("inferSchema", false)
.load("SomeFile.csv"))
val df = df0.repartition(partitionExprs = col("numerocarte"), numPartitions = 42)
df.write
.mode(SaveMode.Overwrite)
.format("parquet")
.option("inferSchema", false)
.save("SomeFile.parquet")
我正在按列 numerocarte 创建 42 个分区。这应该将多个numerocarte 分组到同一个分区。我不想在write 时间做 partitionBy("numerocarte") 因为我不希望每张卡有一个分区。这将是数以百万计的人。
之后,我在另一个脚本中阅读了这个SomeFile.parquet parquet 文件并对其进行了一些操作。特别是我在它上面运行了一个window function,分区是在parquet文件被重新分区的同一列上完成的。
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
val df2 = spark.read
.format("parquet")
.option("header", true)
.option("inferSchema", false)
.load("SomeFile.parquet")
val w = Window.partitionBy(col("numerocarte"))
.orderBy(col("SomeColumn"))
df2.withColumn("NewColumnName",
sum(col("dollars").over(w))
read 之后,我可以看到 repartition 按预期工作,DataFrame df2 有 42 个分区,每个分区都有不同的卡。
问题:
- Spark 是否知道数据帧
df2由列numerocarte分区? - 如果它知道,则窗口函数中不会有随机播放。是吗?
- 如果不知道,它将在窗口函数中进行随机播放。是吗?
- 如果它不知道,我如何告诉 Spark 数据已经被右列分区了?
- 如何查看
DataFrame的分区键?有这个命令吗?我知道如何检查分区数,但如何查看分区键? - 当我在每个步骤之后打印文件中的分区数时,
read之后有 42 个分区,withColumn之后有 200 个分区,这表明 Spark 重新分区了我的DataFrame。 - 如果我有两个使用同一列重新分区的不同表,连接会使用该信息吗?
【问题讨论】:
-
要检查分区器数据帧有什么,您应该查看底层 RDD。
df.rdd.partitioner。如果两个 dfs 具有相同的分区器,则可能没有 shuffle。您可以拨打df.explain查看是否会有随机播放。要检查分区数,请致电df.rdd.partitions.length。有关分区的更完整说明,请参阅jaceklaskowski.gitbooks.io/mastering-apache-spark/…
标签: apache-spark partitioning window-functions