如何在 Apache Spark 中反转排列 DataFrame

Posted

技术标签:

【中文标题】如何在 Apache Spark 中反转排列 DataFrame【英文标题】:How to Reverse arrangement DataFrame in Apache Spark 【发布时间】:2019-07-30 05:54:41 【问题描述】:

如何使用 Scala 反转此 DataFrame。 我看到sort 函数,但必须是特定列,我只想反转它们

+---+--------+-----+
|id |    name|note |
+---+--------+-----+
|1  | james  |any  |
|3  | marry  |some |
|2  | john   |some |
|5  | tom    |any  |
+---+--------+-----+

到:

+---+--------+-----+
|id |    name|note |
+---+--------+-----+
|5  | tom    |any  |
|2  | john   |some |
|3  | marry  |some |
|1  | james  |any  |
+---+--------+-----+

【问题讨论】:

请注意,在大多数情况下,数据帧的顺序没有保证,这就是为什么您找不到任何操作(例如反向)的原因(但是,如果您按列排序,那没问题)。参见例如:issues.apache.org/jira/browse/SPARK-16207 【参考方案1】:

您可以使用monotonically_increasing_id() 添加具有递增id 的列 并按降序排列

val dff = Seq(
  (1, "james", "any"),
  (3, "marry", "some"),
  (2, "john", "some"),
  (5, "tom", "any")
).toDF("id", "name", "note")

dff.withColumn("index", monotonically_increasing_id())
  .sort($"index".desc)
  .drop($"index")
  .show(false)

输出:

+---+-----+----+
|id |name |note|
+---+-----+----+
|5  |tom  |any |
|2  |john |some|
|3  |marry|some|
|1  |james|any |
+---+-----+----+

【讨论】:

【参考方案2】:

你可以这样做:

val reverseDf = df.withColumn("row_num", row_number.over(Window.partitionBy(lit(1)).orderBy(lit(1))))
                .orderBy($"row_num".desc)
                .drop("row_num")

或者参考this而不是行号。

【讨论】:

它不适用于大型数据集(比最强大的执行程序的 RAM 还大),因为它会导致 OOME。

以上是关于如何在 Apache Spark 中反转排列 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Spark 中读取漂亮的打印 json 文件

Apache Spark 2.0:按降序排列到 orderBy() / sort() 列的表达式字符串

如何反转 RDD.takeOrdered() 的排序?

Spark解析json

Spark中RDD的反转

如何在 Apache Spark 中添加 Hive 支持? [复制]