使用 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"))

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

相关内容

  • 没有找到相关文章

最新更新