【发布时间】:2019-04-01 09:59:57
【问题描述】:
我使用 Spark 和 Scala 进行学习。我遇到了一种情况,我需要比较 spark 数据框的一列中存在的记录的有效性。 这就是我创建一个数据框“dataframe1”的方式:
import sparkSession.implicits._
val dataframe1 = Seq("AB","BC","CD","DA","AB","BC").toDF("col1")
数据框1:
+----+
|col1|
+----+
| AB|
| BC|
| CD|
| DA|
| AB|
| BC|
+----+
记录的有效性取决于记录是“AB”还是“BC”的条件。这是我的第一次尝试:
val dataframe2 = dataframe1.withColumn("col2", when('col1.contains("AB") or 'col1.contains("BC"), "valid").otherwise("invalid"))
数据框2:
+----+-------+
|col1| col2|
+----+-------+
| AB| valid|
| BC| valid|
| CD|invalid|
| DA|invalid|
| AB| valid|
| BC| valid|
+----+-------+
但我认为这不是一个好方法,因为如果我需要添加更多有效记录,那么我需要在“when”子句中添加条件,这会增加代码长度并干扰代码的可读性。
所以我尝试将所有有效记录放在一个列表中并检查记录字符串是否存在于列表中。如果它存在,那么它是一个有效的记录,否则不是。以下是本次试用的代码 sn-p:
val validRecList = Seq("AB", "BC").toList
val dataframe3 = dataframe1.withColumn("col2", if(validRecList.contains('col1.toString())) lit("valid") else lit("invalid"))
但不知何故,它没有按预期工作,结果是:
+----+-------+
|col1| col2|
+----+-------+
| AB|invalid|
| BC|invalid|
| CD|invalid|
| DA|invalid|
| AB|invalid|
| BC|invalid|
+----+-------+
谁能告诉我我在这里犯了什么错误?并且,针对这种情况的任何其他通用建议。 谢谢。
【问题讨论】:
-
协议是接受一个答案或另外指明。
标签: scala apache-spark apache-spark-sql scala-collections