Scala中List[Row]转RDD[CassandraRow]报错:asScala非java.util.List成员
问题分析与解决方案
错误原因
你碰到的value asScala is not a member of java.util.List[com.datastax.driver.core.Row]错误,本质是Java集合本身没有asScala方法——这个方法是Scala提供的集合转换工具类里的扩展方法,必须先导入对应的工具包才能使用。
另外,你的代码还有一个隐藏问题:sc.parallelize(Seq(sCollection))会把整个Scala集合包装成一个单元素的Seq,最终生成的是RDD[Seq[Row]],而不是你想要的RDD[Row],这也需要修正。
具体解决步骤
导入集合转换工具类
根据你的Scala版本选择对应的导入:- Scala 2.13及以上(推荐):
import scala.jdk.CollectionConverters._ - Scala 2.12及更早版本:
import scala.collection.JavaConverters._
- Scala 2.13及以上(推荐):
修正代码逻辑
导入后就可以使用asScala把Java的List[Row]转换成Scala兼容的集合,然后直接传入parallelize(不需要再包一层Seq):val result = session.execute("Select * from table where imei= '" + imei + "'") val list = result.all() // 转换为Scala集合 val sCollection = list.asScala // 直接并行化Scala集合,得到RDD[Row] val rdd = sc.parallelize(sCollection.toSeq)
额外建议:避免SQL注入风险
你的SQL语句用字符串拼接的方式传入imei参数,存在SQL注入的风险,推荐使用PreparedStatement来安全传参:
val stmt = session.prepare("Select * from table where imei= ?") val result = session.execute(stmt.bind(imei))
内容的提问来源于stack exchange,提问作者jAi
相关产品推荐
相关产品推荐

