我想使用外部文件过滤数据框。
这就是我现在使用过滤器的方式:
val Insert = Append_Ot.filter(
col("Name2").equalTo("brazil") ||
col("Name2").equalTo("france") ||
col("Name2").equalTo("algeria") ||
col("Name2").equalTo("tunisia") ||
col("Name2").equalTo("egypte"))
我不想使用硬编码的字符串文字,而是想创建一个带有要过滤的值的外部文件。
所以我创建了这个文件:
val filter_numfile = sc.textFile("/user/zh/worskspace/filter_nmb.txt")
.map(_.split(" ")(1))
.collect
这给了我:
filter_numfile: Array[String] = Array(brazil, france, algeria, tunisia, egypte)
然后,我在isin
列上使用Name2
函数。
val Insert = Append_Ot.where($"Name2".isin(filter_numfile: _*))
但这给了我一个空的数据帧。为什么呢?
答案 0 :(得分:1)
我只是在filter dataframe from external file
中向philantrovert回答添加了一些信息他的答案很完美,但可能会有一些案例无法匹配,所以你必须检查案件不匹配
tl; dr 确保字母使用一致的大小写,即它们都是大写或小写。只需使用upper
或lower
标准函数。
假设您输入文件为
1 Algeria
2 tunisia
3 brazil
4 Egypt
您阅读了文本文件并将所有国家/地区更改为小写
val countries = sc.textFile("path to input file").map(_.split(" ")(1).trim)
.collect.toSeq
val array = Array(countries.map(_.toLowerCase) : _*)
然后你有数据框
val Append_Ot = sc.parallelize(Seq(("brazil"),("tunisia"),("algeria"),("name"))).toDF("Name2")
您应用以下条件
import org.apache.spark.sql.functions._
val Insert = Append_Ot.where(lower($"Name2").isin(array : _* ))
你应该输出
+-------+
|Name2 |
+-------+
|brazil |
|tunisia|
|algeria|
+-------+
空数据框可能也是由于拼写不匹配造成的。