Apache spark 将列的不同值间隔映射为整数
我在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
customer | age
--------------------
A 25
B 17
C 8
WARE customer和age列均为字符串类型
所以
- 如果
时使用(0>=age=age=age您可以使用
和multiplewith column
函数来给出您的条件。请尝试以下代码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 | +------------+-------+