Scala Spark Dataset:如何筛选列值存在于列表中的数据
解决Spark Dataset筛选姓名匹配列表的问题
你的代码报错是因为使用了错误的Spark表达式语法,结合Dataset的类型化特性,以下是正确的解决方案:
前提假设
假设你的Dataset基于一个case class定义(这是Spark类型化Dataset的标准用法):
case class Person(forename: String, surname: String) val A: Dataset[Person] = // 你的Dataset实例
推荐方案(类型化Dataset标准写法)
直接使用lambda表达式操作case class的字段,结合Scala集合的contains方法,这种方式有编译时类型检查,更符合Dataset的类型化特性:
val namesToTest = List("Madeleine","Sarah") A.filter(person => namesToTest.contains(person.forename)).show()
备选方案(基于Column表达式)
如果偏好使用Spark的Column API写法,也可以用isin方法,注意需要把列表转换为可变参数传入:
val namesToTest = List("Madeleine","Sarah") A.filter($"forename".isin(namesToTest: _*)).show()
错误原因说明
你原代码的问题:
- 错误使用了
contains in语法,Spark SQL/Column API中判断字段是否在集合中,正确写法是IN(字符串表达式)或isin(Column方法) - 字符串表达式中无法直接引用Scala变量
namesToTest,必须通过参数传递或转换为Column操作
内容的提问来源于stack exchange,提问作者Serena Campbell UK
相关产品推荐
相关产品推荐

