如何在 Spark RDD 中复制 SQL 的行编号
理解问题
你想要为 Spark RDD 中的每个条目生成连续的行号,按特定列排序并分区通过一个关键列。类似于 SQL 的 row_number() over (partition by ... order by ...),但使用 Spark RDD。
您的初始尝试
您的初始尝试使用sortByKey 和 zipWithIndex,它们没有生成所需的分区行号。请注意,sortBy 并不直接适用于 RDD,需要您先收集它们,从而导致非 RDD 输出。
使用 Spark 1.4 的解决方案
数据准备
使用 (K, (col1, col2, col3)).
val sample_data = Seq(((3,4),5,5,5),((3,4),5,5,9),((3,4),7,5,5),((1,2),1,2,3),((1,2),1,4,7),((1,2),2,2,3)) val temp1 = sc.parallelize(sample_data)
生成分区行号
在分区窗口上使用 rowNumber 为每个键生成行号:
import org.apache.spark.sql.functions._ temp1.toDF("key", "col1", "col2", "col3").withColumn("rownum", rowNumber() over (Window partitionBy "key" orderBy desc("col2"), "col3")))
示例输出
+---+----+----+----+------+ |key|col1|col2|col3|rownum| +---+----+----+----+------+ |1,2|1 |4 |7 |2 | |1,2|1 |2 |3 |1 | |1,2|2 |2 |3 |3 | |3,4|5 |5 |5 |1 | |3,4|5 |5 |9 |2 | |3,4|7 |5 |5 |3 | +---+----+----+----+------+
以上是如何在 Spark RDD 中生成连续行号,类似于 SQL 的'row_number()”?的详细内容。更多信息请关注PHP中文网其他相关文章!