Apache spark 将列的不同值间隔映射为整数

Apache spark 将列的不同值间隔映射为整数,apache-spark,dataframe,Apache Spark,Dataframe,我在Spark中有一个数据帧: customer | age -------------------- A 25 B 17 C 8 WARE customer和age列均为字符串类型 所以 如果(0>=age=age=age您可以使用with column和multiplewhen函数来给出您的条件。请尝试以下代码 df.withColumn("customer_new", $"customer") .with

我在Spark中有一个数据帧:

customer  |   age
--------------------
    A         25
    B         17
    C         8
WARE customer和age列均为字符串类型

所以


  • 如果
    (0>=age=age=age您可以使用
    with column
    和multiple
    when
    函数来给出您的条件。请尝试以下代码

    df.withColumn("customer_new", $"customer")
      .withColumn("age_new",
        when($"age" >= 0 && $"age" <= 10, 0).
          when($"age" >= 11 && $"age" <= 20, 1).
          when($"age" >= 21 && $"age" <= 30, 2)).
      select("customer_new", "age_new").show()
    

    第一步是将列类型转换为double

    val df = Seq(("a", "25"), ("b", "17"), ("c", "8")).toDF("customer", "age")
      .withColumn("age", $"age".cast(DoubleType)) 
    
    然后,在您只有几个条件的情况下,可以在
    时使用
    ,在其他情况下使用
    。例如,使用您的输入数据和条件:

    val df2 = df.withColumn("age_new", 
      when($"age" <= 10, 0.0).
      when($"age" <= 20, 1.0).
      when($"age" <= 30, 2.0).
      otherwise(3.0))
    
    两种情况下的输出相同(可以使用
    选择
    删除
    年龄
    列):

    建议尽可能多地使用内置函数。因为当函数已经被其他人建议时,您可以尝试使用map函数

    import sqlContext.implicits._
    df.map(row => {
      val age = row.getAs[String]("age").trim.toInt
      (row.getAs[String]("customer"), if(age >= 0 && age <= 10) "0" else if(age >= 11 && age <= 20) "1" else if(age >= 21 && age <= 30) "2" else null)
    })
      .toDF("customer_new", "age_new")
    

    您可以使用withcolumn来创建可能重复的条件
    val df2 = df.withColumn("age_new", 
      when($"age" <= 10, 0.0).
      when($"age" <= 20, 1.0).
      when($"age" <= 30, 2.0).
      otherwise(3.0))
    
    val splits = Array(0.0, 10.0, 20.0, 30.0)
    val bucketizer = new Bucketizer().setInputCol("age").setOutputCol("age_new").setSplits(splits)
    val df3 = bucketizer.transform(df)
    
    +--------+----+-------+
    |customer| age|age_new|
    +--------+----+-------+
    |       a|25.0|    2.0|
    |       b|17.0|    1.0|
    |       c| 8.0|    0.0|
    +--------+----+-------+
    
    import sqlContext.implicits._
    df.map(row => {
      val age = row.getAs[String]("age").trim.toInt
      (row.getAs[String]("customer"), if(age >= 0 && age <= 10) "0" else if(age >= 11 && age <= 20) "1" else if(age >= 21 && age <= 30) "2" else null)
    })
      .toDF("customer_new", "age_new")
    
    +------------+-------+
    |customer_new|age_new|
    +------------+-------+
    |A           |2      |
    |B           |1      |
    |C           |0      |
    +------------+-------+