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