我正在使用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;错误。有什么建议吗?
答案 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
您现在可以DataFrame
,val df = dTestSample1.select("ID").groupBy("ID").count()
或使用collect
执行任何类型的操作,其中包含show
列的每个值的出现次数。