Azure 在spark dataframe的列中重复一组字符串值

Azure 在spark dataframe的列中重复一组字符串值,azure,apache-spark-sql,Azure,Apache Spark Sql,我正在尝试向spark dataframe中的column=category添加一组字符串值(商务、休闲) 我的数据帧是: +----------+----+--------+ | source|live|category| +----------+----+--------+ | Ford| Y| | | Ford| Y| | | Caddilac| Y| | | Caddilac| Y| |

我正在尝试向spark dataframe中的column=category添加一组字符串值(商务、休闲)

我的数据帧是:

+----------+----+--------+
|    source|live|category|
+----------+----+--------+
|      Ford|   Y|        |
|      Ford|   Y|        |
|  Caddilac|   Y|        |
|  Caddilac|   Y|        |
| Chevrolet|   Y|        |
| Chevrolet|   Y|        |
|     Skoda|   Y|        |
|     Skoda|   Y|        |
|      Fiat|   Y|        |
|      Fiat|   Y|        |
|Alfa Romeo|   Y|        |
|Alfa Romeo|   Y|        |
+----------+----+--------+
我正在努力获得的是新/现有列中的一组重复值:

|    source|live|category|
+----------+----+--------+
|      Ford|   Y|Business|
|      Ford|   Y|  Casual|
|  Caddilac|   Y|Business|
|  Caddilac|   Y|  Casual|
| Chevrolet|   Y|Business|
| Chevrolet|   Y|  Casual|
|     Skoda|   Y|Business|
|     Skoda|   Y|  Casual|
|      Fiat|   Y|Business|
|      Fiat|   Y|  Casual|
|Alfa Romeo|   Y|Business|
|Alfa Romeo|   Y|  Casual|
+----------+----+--------+

我曾尝试使用withColumn和lit()添加“category”列,但它在参数中只需要1个值。 我还尝试了explode(array()),但它将表乘以两行

“类别”列中的值是恒定的和重复的,不依赖于任何其他标准

任何帮助都将不胜感激。 谢谢

使用
functions.rand()
生成随机编号并用2模化。 基于1和0输出结果

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

object RandColumn {

  def main(args: Array[String]): Unit = {

    val spark = Constant.getSparkSess

    import spark.implicits._


    val df = List(("Ford","Y"),("Ford","Y"),
      ("Caddilac","Y"),("Caddilac","Y")
    ).toDF("source","live")

    df
      .withColumn("category",when( ( (rand()*100) % 2).cast(DataTypes.IntegerType) === 0,"Business")
      .otherwise("Casual"))
      .drop("randomNo")
      .show()
  }

}


用列(“类别”、表达式(“元素(数组('Business'、'Casual')、行号()覆盖(按源划分、按源实时排序、实时))尝试此操作-

试验-

加载测试数据
val数据=
"""
|来源|现场
|福特
|福特
|卡迪拉克| Y
|卡迪拉克| Y
|雪佛兰| Y
|雪佛兰| Y
|斯柯达
|斯柯达
|菲亚特| Y
|菲亚特| Y
|阿尔法罗密欧
|阿尔法罗密欧
“.stripMargin”
val stringDS=data.split(System.lineSeparator())
.map(\\\\\).map(\.replaceAll(“^[\t]+\\t]+$”,“).mkString(“,”)
.toSeq.toDS()
val df=spark.read
.期权(“sep”、“、”)
.选项(“推断模式”、“真”)
.选项(“标题”、“正确”)
.选项(“空值”、“空值”)
.csv(stringDS)
df.show(假)
df.printSchema()
/**
* +----------+----+
*|来源|现场|
* +----------+----+
*|福特| Y|
*|福特| Y|
*|卡迪拉克| Y|
*|卡迪拉克| Y|
*|雪佛兰| Y|
*|雪佛兰| Y|
*|斯柯达| Y|
*|斯柯达| Y|
*|菲亚特| Y|
*|菲亚特| Y|
*阿尔法·罗密欧|
*阿尔法·罗密欧|
* +----------+----+
*
*根
*|--源:字符串(nullable=true)
*|--live:string(nullable=true)
*/
派生类别列
df.withColumn(“category”,expr(“element_at(数组('Business','Casual')),row_number())over(按源划分)+
“实时订单(按来源,实时))))
.show(假)
/**
* +----------+----+--------+
*|来源|现场|类别|
* +----------+----+--------+
*阿尔法·罗密欧的生意|
*|阿尔法·罗密欧| Y |休闲|
*| Caddilac | Y |业务|
*| Caddilac | Y |休闲|
*|雪佛兰| Y |商务|
*|雪佛兰| Y |休闲|
*|福特| Y |业务|
*|福特| Y |休闲|
*|斯柯达| Y |业务|
*|斯柯达| Y |休闲|
*|菲亚特| Y |业务|
*|菲亚特| Y |休闲|
* +----------+----+--------+
*/

另一种方法

df.withColumn("rn", row_number().over(Window.partitionBy($"source").orderBy($"source"))).withColumn("category", when($"rn" % 2 === 0, "Casual").otherwise("Business")).drop("rn").show
+--------+----+--------+
|  source|live|category|
+--------+----+--------+
|Caddilac|   Y|Business|
|Caddilac|   Y|  Casual|
|    Ford|   Y|Business|
|    Ford|   Y|  Casual|
+--------+----+--------+