使用Scala / Spark复制列中的值

时间:2017-11-04 11:52:41

标签: scala apache-spark apache-spark-sql spark-dataframe

我有一个特定的问题,需要使用 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 的新手,现在已经坚持了很长时间。请帮帮我。

3 个答案:

答案 0 :(得分:1)

进口:

import org.apache.spark.sql.functions._

解决方案:

df.groupBy("ColA").agg(collect_list("ColA").alias("tmp"))
  .select(posexplode($"tmp"))

答案 1 :(得分:1)

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

答案 2 :(得分:0)

试试这个:

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