apachespark case,在不同的列上有多个when子句

fcy6dtqo  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(302)

鉴于以下结构:

val df = Seq("Color", "Shape", "Range","Size").map(Tuple1.apply).toDF("color")

val df1 = df.withColumn("Success", when($"color"<=> "white", "Diamond").otherwise(0))

我想写一个以上的条件时,其中大小>10和形状列值是菱形,然后“钻石”值应插入列,否则0。我试过了,但失败了

val df1 = df.withColumn("Success", when($"color" <=> "white", "Diamond").otherwise(0)).when($"size">10)

请建议我只有Dataframe与scala选项。sparksql和sqlcontext对我来说没有帮助。
谢谢!

eagi6jfj

eagi6jfj1#

你有没有试着做一个自定义项?试着这样做:

// Define the UDF
val isDiamond= udf((color: String, shape: String, size : String) => {
  if (color == "white" && shape == "Rhombus" && size > 10) "Diamond"
  else ""
})
val df2 = df.withColumn("Success", isDiamond($"color", $"shape", $"size"))

当做。

sg3maiej

sg3maiej2#

你可以用链子锁住 when 与中的示例类似https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/column.html#when-org.apache.spark.sql.column-java.lang.object-从(1.4.0)开始提供

// Scala:
people.select(when(people("gender") === "male", 0)
 .when(people("gender") === "female", 1)
 .otherwise(2))

你的例子:

val df1 = df.withColumn("Success",
  when($"color" <=> "white", "Diamond")
  .when($"size" > 10 && $"shape" === "Rhombus", "Diamond")
  .otherwise(0))

相关问题