Scala中如何从Cassandra ResultSet读取map<text,text>类型列
Spark读取Cassandra map列报错解决方案
问题场景
使用Spark连接Cassandra数据库,表内包含map<text,text>类型列,其他列可正常读取,但该map列读取失败。代码示例如下:
val query = "SELECT * FROM mydatabase.mytable;" val conf = spark.sparkContext.getConf val connector = CassandraConnector.apply(conf); val session = connector.openSession(); val rs = session.execute(query) //resultset val rows = rs.all().map { row => val pk = row.getString("pk") val column2= row.getString("column2") val column3 = row.getInt("column3") val mapColumn = row.getMap[String, String]("mapColumn") Row(pk , column2, column3 , mapColumn ) }
报错信息
error: overloaded method value getMap with alternatives: [KeyT, ValueT](x$1: com.datastax.oss.driver.api.core.CqlIdentifier, x$2: Class[KeyT], x$3: Class[ValueT])java.util.Map[KeyT,ValueT] [KeyT, ValueT](x$1: String, x$2: Class[KeyT], x$3: Class[ValueT])java.util.Map[KeyT,ValueT] [KeyT, ValueT](x$1: Int, x$2: Class[KeyT], x$3: Class[ValueT])java.util.Map[KeyT,ValueT] cannot be applied to (String) val mapColumn= row.getMap("mapColumn")
解决方法
报错核心原因是getMap方法需要显式传入键和值的Class类型参数,原代码仅传递了列名,不符合方法签名要求。
1. 修正map列读取代码
直接传入键值类型的Class对象:
val mapColumn = row.getMap("mapColumn", classOf[String], classOf[String])
或保留Scala泛型声明:
val mapColumn = row.getMap[String, String]("mapColumn", classOf[String], classOf[String])
2. 转换为Scala Map(可选)
如果需要将返回的java.util.Map转为Scala原生Map,可添加转换代码:
import scala.collection.JavaConverters._ val mapColumn = row.getMap("mapColumn", classOf[String], classOf[String]).asScala.toMap
内容的提问来源于stack exchange,提问作者Eric Cabral
相关产品推荐
相关产品推荐

