繁体   English   中英

Scala udf检查df列值是否在列表中

[英]Scala udf check if df column value is in a list

我正在编写一个scala UDF,它从列中获取值,并检查列表中是否存在特定值,然后执行某些操作,是否存在其他值则执行某些操作等等。 例如:

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列是否包含列表中的真/假值的任何建议?

假设您有一个类似以下的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|
+---+----+-----+-------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM