使用 Scala/Spark 复制列中的值

Replicate values in a column using Scala/Spark

我有一个特定的问题,需要使用 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"))

试试这个:

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|
+----+----+

您可以使用 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   |
+----+----+