首页 > 解决方案 > Spark DataFrame orderBy 和 DataFrameWriter sortBy,有区别吗?

问题描述

.write在 DataFrame 上的命令之前或之后排序之间的输出是否存在差异?

val people : DataFrame[Person]

people
        .orderBy("name")
        .write
        .mode(SaveMode.Append)
        .format("parquet")
        .saveAsTable("test_segments") 

val people : DataFrame[Person]

people
        .write
        .sortBy("name")
        .mode(SaveMode.Append)
        .format("parquet")
        .saveAsTable("test_segments") 

标签: scalaapache-sparkapache-spark-sql

解决方案


代码中的注释解释了它们之间的区别:

  • orderBy:是 Dataset/Dataframe 操作。返回按给定表达式排序的新数据集。这是排序函数的别名。
  • sortBy:是一个DataFrameWriter操作。按给定列对每个桶中的输出进行排序。

sortBy方法仅在您还定义存储桶 ( bucketBy) 时才有效。否则你会得到一个异常

if (sortColumnNames.isDefined && numBuckets.isEmpty) {
  throw new AnalysisException("sortBy must be used together with bucketBy")
}

中定义的列在BucketSpecsortBy中使用,如下所示:sortColumnNames

Params:
numBuckets – number of buckets.
bucketColumnNames – the names of the columns that used to generate the bucket id.
sortColumnNames – the names of the columns that used to sort data in each bucket.

case class BucketSpec(
    numBuckets: Int,
    bucketColumnNames: Seq[String],
    sortColumnNames: Seq[String])

推荐阅读