Как изменить значение столбца в соответствии со значением другого столбца в искровом DataFrame - PullRequest
0 голосов
/ 07 мая 2020

Я начинаю с этого фрейма данных

DF1
+----+-------+-------+-------+
|name | type  |item1 | item2 |
+-----+-------+------+-------+
|apple|fruit  |apple1|apple2 |
|beans|vege   |beans1|beans2 |
|beef |meat   |beef1 |beef2  |
|kiwi |fruit  |kiwi1 |kiwi2  |
|pork |meat   |pork1 |pork2  |
+-----+-------+--------------+

Теперь я хочу заполнить столбец с именем «prop» на основе значения столбца столбца «type», как в DF2. Например,

If "type"== "fruit" then "prop"="item1"
If "type"== "vege" then "prop"="item1"
If "type"== "meat" then "prop"="item2"

Как лучше всего это получить? Я думал фильтровать на основе каждого «типа», заполнять столбец «prop», а затем объединять полученные кадры данных. Это кажется не очень эффективным.

DF2
+----+-------+-------+-------+-------+
|name | type  |item1 | item2 | prop  |
+-----+-------+------+-------+-------+
|apple|fruit  |apple1|apple2 |apple1 |
|beans|vege   |beans1|beans2 |beans1 |
|beef |meat   |beef1 |beef2  |beef2  |
|kiwi |fruit  |kiwi1 |kiwi2  |kiwi1  |
|pork |meat   |pork1 |pork2  |pork2  |
+-----+-------+--------------+-------+

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Это можно сделать, объединив when и otherwise, как показано ниже

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

object WhenThen {

  def main(args: Array[String]): Unit = {
    val spark = Constant.getSparkSess


    import spark.implicits._
    val df = List(("apple","fruit","apple1","apple2"),
      ("beans","vege","beans1","beans2"),
      ("beef","meat","beef1","beans2"),
      ("kiwi","fruit","kiwi1","beef2"),
      ("pork","meat","pork1","pork2")
    ).toDF("name","type","item1","item2" )

   df.withColumn("prop",
      when($"type" === "fruit", $"item1").otherwise(
        when($"type" === "vege", $"item1").otherwise(
          when($"type" === "meat", $"item2").otherwise("")
        )
      )).show()
  }

}
1 голос
/ 07 мая 2020

Используйте в этом случае операторы when+otherwise, которые очень эффективны в Spark .

//sample data
df.show()
//+-----+-----+------+------+
//| name| type| item1| item2|
//+-----+-----+------+------+
//|apple|fruit|apple1|apple2|
//|beans| vege|beans1|beans2|
//| beef| meat| beef1| beef2|
//| kiwi|fruit| kiwi1| kiwi2|
//| pork| meat| pork1| pork2|
//+-----+-----+------+------+

//using isin function
df.withColumn("prop",when((col("type").isin(Seq("vege","fruit"):_*)),col("item1")).when(col("type") === "meat",col("item2")).otherwise(col("type"))).show()

df.withColumn("prop",when((col("type") === "fruit") ||(col("type") === "vege"),col("item1")).when(col("type") === "meat",col("item2")).
otherwise(col("type"))).
show()
//+-----+-----+------+------+------+
//| name| type| item1| item2|  prop|
//+-----+-----+------+------+------+
//|apple|fruit|apple1|apple2|apple1|
//|beans| vege|beans1|beans2|beans1|
//| beef| meat| beef1| beef2| beef2|
//| kiwi|fruit| kiwi1| kiwi2| kiwi1|
//| pork| meat| pork1| pork2| pork2|
//+-----+-----+------+------+------+
...