apache-spark - Spark 知道 DataFrame 的分区键吗?

标签 apache-spark partitioning window-functions

我想知道 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")

我正在按列创建 42 个分区 numerocarte .这应该分组多个 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 分区?
  • 如果它知道,那么窗口函数中就不会出现shuffle。真的?
  • 如果它不知道,它会在窗口函数中做一个 shuffle。真的?
  • 如果它不知道,我如何告诉 Spark 数据已经按正确的列进行了分区?
  • 如何检查 DataFrame 的分区键?有这个命令吗?我知道如何检查分区数但如何查看分区键?
  • 当我在每一步之后打印文件中的分区数时,我在 read 之后有 42 个分区和 withColumn 之后的 200 个分区这表明 Spark 重新分区了我的 DataFrame .
  • 如果我用同一列重新分区了两个不同的表,连接会使用该信息吗?
  • 最佳答案

    Does Spark know that the dataframe df2 is partitioned by column numerocarte?



    它不是。

    If it does not know, how do I tell Spark the data is already partitioned by the right column?



    你没有。仅仅因为您保存了已洗牌的数据,并不意味着它将以相同的拆分加载。

    How can I check a partitioning key of DataFrame?



    加载数据后没有分区键,但您可以查看queryExecutionPartitioner .

    在实践中:
  • 如果您想支持键上的有效下推,请使用 partitionBy DataFrameWriter的方法.
  • 如果您想要对连接优化的有限支持,请使用 bucketBy带有元存储和持久表。

  • How to define partitioning of DataFrame?有关详细示例。

    关于apache-spark - Spark 知道 DataFrame 的分区键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50544852/

    相关文章:

    hadoop - 在主 Spark 作业中启动多个 Spark 作业

    mongodb - 无法在身份验证模式下使用 Mongo 连接 Mongo-Spark Connector

    java - 如何使用Spring Cloud Stream实现自定义kafka分区

    java - 如何比较两对rdd

    java - 如何在 Spark 中按字段对数据进行分组?

    sql - Oracle 分区修剪与绑定(bind)变量

    mysql - 拥有可以访问的存档的最佳方式

    SQL 窗口函数 - SELECT DISTINCT ORDER BY LIMIT

    sql - 选择运动员在过去 3 项比赛中未获得第一名的成绩

    python - 如何创建滑动窗口并在 pandas 数据框中应用函数