фильтровать или маркировать строки на основе массива Scala - PullRequest
2 голосов
/ 25 апреля 2019

Есть ли способ фильтровать или маркировать строки на основе массива Scala?

Имейте в виду, что в действительности количество строк намного больше.

пример данных

val clients= List(List("1", "67") ,List("2", "77") ,List("3", "56"),List("4","90")).map(x =>(x(0), x(1)))
val df = clients.toDF("soc","ages")

+---+----+
|soc|ages|
+---+----+
|  1|  67|
|  2|  77|
|  3|  56|
|  4|  90|
| ..|  ..|
+---+----+

Я бы хотел отфильтровать все возрасты в массиве Scala, скажем,

var z = Array(90, 56,67).
df.where(($"ages" IN z)

или

df..withColumn("flag", when($"ages" >= 30 , 1)
              .otherwise(when($"ages" <= 5, 2)
                .otherwise(3))

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Вы также можете передать каждый элемент как аргумент, используя оператор _* для массива.

Затем напишите кейс when otherwise using isin

Ex:

val df1 = Seq((1, 67), (2, 77), (3, 56), (4, 90)).toDF("soc", "ages")
val z = Array(90, 56,67)
df1.withColumn("flag", 
                     when('ages.isin(z: _*), "in Z array")
                     .otherwise("not in Z array"))
                     .show(false)
+---+----+--------------+
|soc|ages|flag          |
+---+----+--------------+
|1  |67  |in Z array    |
|2  |77  |not in Z array|
|3  |56  |in Z array    |
|4  |90  |in Z array    |
+---+----+--------------+
2 голосов
/ 25 апреля 2019

один вариант - это udf.

scala> val df1 = Seq((1, 67), (2, 77), (3, 56), (4, 90)).toDF("soc", "ages")
df1: org.apache.spark.sql.DataFrame = [soc: int, ages: int]

scala> df1.show
+---+----+
|soc|ages|
+---+----+
|  1|  67|
|  2|  77|
|  3|  56|
|  4|  90|
+---+----+


scala> val scalaAgesArray = Array(90, 56,67)
scalaAgesArray: Array[Int] = Array(90, 56, 67)

scala> val containsAgeUdf = udf((x: Int) => scalaAgesArray.contains(x))
containsAgeUdf: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,BooleanType,Some(List(IntegerType)))

scala> val outputDF = df1.withColumn("flag", containsAgeUdf($"ages"))
outputDF: org.apache.spark.sql.DataFrame = [soc: int, ages: int ... 1 more field]

scala> outputDF.show(false)
+---+----+-----+
|soc|ages|flag |
+---+----+-----+
|1  |67  |true |
|2  |77  |false|
|3  |56  |true |
|4  |90  |true |
+---+----+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...