Scala udf проверяет, есть ли в списке значение столбца df - PullRequest
0 голосов
/ 15 апреля 2019

Я пишу UDF scala, который берет значения из столбца и проверяет, существуют ли конкретные значения в списке, затем что-то делает, а если существует какое-то другое значение, делает что-то и так далее.Например:

val listOfValues = List("001", "002", "003", "004", "005")

if ($"column".isin(listOfValues: _*) || (logic 2) && (logic 3)) "value 1"
else if ($"column".isin(listOfValues: _*) || (logic 3) || (logic 4)) "value 2"
else if ($"column".isin(listOfValues: _*) && (logic 4) && (logic 5)) "value 3"
else "value 4"

Теперь проблема в том, что $"column".isin(listOfValues: _*) возвращает столбец, но не одно значение true / false.И мне нужно там значение true / false для каждой строки, чтобы правильно использовать условие.

Любые предложения о том, как проверить, что столбец df содержит эти значения в списке как true / false?

1 Ответ

1 голос
/ 15 апреля 2019

Если у вас есть DF, как показано ниже:

+---+----+-----+
|ID |Type|Value|
+---+----+-----+
|ID1|001 |1    |
|ID1|002 |5    |
|ID2|A   |12   |
|ID3|A   |3    |
|ID3|B   |3    |
|ID3|002 |5    |
|ID4|A   |10   |
+---+----+-----+

Вы можете создать UDF, чтобы проверить, есть ли значение столбца в списке. Например:

val listOfValues = List("001", "002", "003", "004", "005")
def isInDef(p1: String): String = if (listOfValues.contains(p1) || (logic 2) && (logic 3)) "value 1"
                                  else if (listOfValues.contains(p1) || (logic 3) || (logic 4)) "value 2"
                                  else if (listOfValues.contains(p1) && (logic 4) && (logic 5)) "value 3"
                                  else "value 4"
val isIn = udf[String, String](isInDef)

Затем вы можете использовать UDF для создания нового столбца с правильным значением из условий:

df = df.withColumn("contain", isIn($"Type"))

+---+----+-----+-------+
|ID |Type|Value|contain|
+---+----+-----+-------+
|ID1|001 |1    |value 1|
|ID1|002 |5    |value 2|
|ID2|A   |12   |value 4|
|ID3|A   |3    |value 4|
|ID3|B   |3    |value 4|
|ID3|002 |5    |value 3|
|ID4|A   |10   |value 4|
+---+----+-----+-------+
...