Blobs地图在Cassandra桌里

时间:2018-02-19 13:42:21

标签: scala cassandra phantom-dsl

尝试创建新表,其中每一行都可以有额外的数据,称为上下文,即键/值映射。键是字符串,值可以是几个字节(字节数组)。

以下定义无法编译,并出现以下错误:

Error:(55, 30) Cannot find primitive implementation for class Array
  object context extends MapColumn[String, Array[Byte]] 

这是我的代码:

case class UserJourny(
                       id: Long,
                       time: Int,
                       activity_type: Int,
                       context: Map[String, Array[Byte]]
               )


abstract class UserJournyModel extends Table[UserJournyModel, UserJourny] {
  override def tableName: String = "user_journy"

  object dyid extends BigIntColumn with PartitionKey {
    override lazy val name = "id"
  }

  object time extends IntColumn with ClusteringOrder with Descending {
    override lazy val name = "time"
  }

  object activity_type extends IntColumn
  object context extends MapColumn[String, Array[Byte]]
}

我该怎么做?

1 个答案:

答案 0 :(得分:1)

使用MapColumn[String, ByteBuffer]代替,Cassandra本身可以理解。然后你需要一些基本的有趣的东西来将字节数组编码到缓冲区。

val buf = ByteBuffer.wrap(Array[Byte](1, 2, 3, 4, 5))

您还可以衍生出一个原语,让您的整体生活更轻松。

implicit val byteArrayPrimitive = Primitive.derive[
  Array[Byte],
  ByteBuffer
](ByteBuffer.wrap)(_.array)

现在您可以成功使用MapColumn[String, Array[Byte]],而且Cassandra会将其存储为buffer,但它内部会有map<text, buffer>类型。