如何根据String数组值过滤CSV文件

时间:2018-01-16 22:34:04

标签: arrays string scala apache-spark filtering

我正在使用Spark Scala,我从CSV列创建了一个String数组,我想使用数组值来过滤另一个CSV文件。我正在尝试使用此代码:

val ID_a = dTestSample1.select("ID").dropDuplicates("ID")
val x =ID_a.select("ID").collect().map { row => row.toString() }
var i = 0 
for (newID <- x){
  val sbinPercent5 = dTestSample1.filter("ID".equals(newID )) ...................................
  i+=1 }

我正在获得&#34;重载方法值过滤器&#34;错误。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

ID_a.select("ID").collect()

这段代码返回Array,然后通过将Array[String]函数与row => row.toString()一起应用,转换为map。但是,此时您不再拥有DataFrame

Array有一个隐式转换,允许您在其上使用filter等方法。 filter高阶函数,它采用谓词,在您的情况下,函数类似于以下String => Boolean。但是,您不是传递一个带String并返回Boolean的函数,而是直接调用字符串equals上的方法"ID",因此您传递{ {1}} filter而不是谓词。

看起来您正在尝试将DataFrame API用于Boolean,但是您可以采取的措施只是将谓词传递给Array方法:

filter

或更明确地

 dTestSample1.filter(s => s.equals(newID))

然而,我的建议是尝试为您正在进行的查询充分利用DataFrame API,这显然是在计算初始{{1}的 dTestSample1.filter(_.equals(newID)) 列中给定值的出现次数这可以简单地表达如下:

ID

您现在可以DataFrameval df = dTestSample1.select("ID").groupBy("ID").count() 或使用collect执行任何类型的操作,其中包含show列的每个值的出现次数。