如何在 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 文件