我需要在spark-cassandra-connector的spark中读取cassandra blob
类型,并根据blob字段比较两个数据集。
以下代码示例显示了我的意思:
// Cassandra Table
CREATE TABLE keyspace.test (
id bigint,
info blob,
PRIMARY KEY (id)
)
case class Test(
id: Long,
info: java.nio.ByteBuffer
)
session.read
.format("org.apache.spark.sql.cassandra")
.options(Map(
"table" -> tableName,
"keyspace" -> keySpaceName,
"cluster" -> clusterName
)).load().map(i => Test(i.getLong(0), i.get???(1)))
我需要方法而不是i.get???(1)
来读取blob作为ByteBuffer。我已经尝试row.getAs[Array[Byte]](i)
,但它不满足我的需要,因为无法比较两个对象。
答案 0 :(得分:0)
据我所知,ByteBuffer
不是解决方案,因为Spark并没有为它提供默认编码器,我必须首先开发我的编码器来阅读和使用它。无论如何ByteBuffer
围绕内容实施equals
方法。
但为了简单使用,我将blob
视为Array[Byte]
并将其转换为具有默认编码器的Seq[Byte]
。
case class Test(
id: Long,
info: Seq[Byte]
)
session.read
.format("org.apache.spark.sql.cassandra")
.options(Map(
"table" -> tableName,
"keyspace" -> keySpaceName,
"cluster" -> clusterName
)).load().map(i => Test(i.getLong(0), (i.getAs[Array[Byte]](1)).toSeq ))
答案 1 :(得分:0)
方法是getBytes,它返回一个ByteBuffer