我有一个特定的问题,需要使用Scala/SPARK来解决。
我在Dataframe
中有一列,如下所示
ColA
Tag1
Tag2
Tag3
Tag1
Tag2
Tag3
Tag1
Tag2
Tag3
现在我想在dataframe
中包含一个新列,如下所示,以所需的格式显示。
ColA ColB
Tag1 1
Tag2 1
Tag3 1
Tag1 2
Tag2 2
Tag3 2
Tag1 3
Tag2 3
Tag3 3
这可以在 Scala/Spark 中完成吗?我是 Scala/Spark 的新手,现在已经坚持了很长时间。请帮我解决这个问题。
导入:
import org.apache.spark.sql.functions._
溶液:
df.groupBy("ColA").agg(collect_list("ColA").alias("tmp"))
.select(posexplode($"tmp"))
您可以使用Window
函数(row_number()
)生成ColB
,如下所示
import org.apache.spark.sql.expressions.Window
val windowSpec = Window.partitionBy("ColA").orderBy("ColA")
import org.apache.spark.sql.functions._
df.withColumn("ColB", row_number().over(windowSpec)).show(false)
您应该具有以下输出
+----+----+
|ColA|ColB|
+----+----+
|Tag1|1 |
|Tag1|2 |
|Tag1|3 |
|Tag3|1 |
|Tag3|2 |
|Tag3|3 |
|Tag2|1 |
|Tag2|2 |
|Tag2|3 |
+----+----+
试试这个:
import org.apache.spark.sql.functions._
df.createOrReplaceTempView("tab")
val q = """
SELECT ColA, ROW_NUMBER() OVER(PARTITION BY ColA ORDER BY ColA) as ColB
FROM tab
ORDER BY ColB, ColA
"""
val res = spark.sql(q)
结果:
scala> res.show
+----+----+
|ColA|ColB|
+----+----+
|Tag1| 1|
|Tag2| 1|
|Tag3| 1|
|Tag1| 2|
|Tag2| 2|
|Tag3| 2|
|Tag1| 3|
|Tag2| 3|
|Tag3| 3|
+----+----+