如何使用isin函数与文本文件中的值?

时间:2017-07-13 12:27:57

标签: apache-spark apache-spark-sql

我想使用外部文件过滤数据框。

这就是我现在使用过滤器的方式:

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: _*))

但这给了我一个空的数据帧。为什么呢?

1 个答案:

答案 0 :(得分:1)

我只是在filter dataframe from external file

中向philantrovert回答添加了一些信息

他的答案很完美,但可能会有一些案例无法匹配,所以你必须检查案件不匹配

tl; dr 确保字母使用一致的大小写,即它们都是大写或小写。只需使用upperlower标准函数。

假设您输入文件为

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|
+-------+

空数据框可能也是由于拼写不匹配造成的。