我想知道 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 个分区,每个分区都有不同的卡。问题:
df2
按列 numerocarte
分区? 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?
加载数据后没有分区键,但您可以查看
queryExecution
为 Partitioner
.在实践中:
partitionBy
DataFrameWriter
的方法. bucketBy
带有元存储和持久表。 见 How to define partitioning of DataFrame?有关详细示例。
关于apache-spark - Spark 知道 DataFrame 的分区键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50544852/