使用spark-cassandra-connector

时间:2017-10-14 11:11:28

标签: scala apache-spark cassandra spark-cassandra-connector

我需要在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),但它不满足我的需要,因为无法比较两个对象。

2 个答案:

答案 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