如何在Cassandra

时间:2018-08-14 15:29:44

标签: scala cassandra-3.0

我正在以base64消息的形式发送json格式的图片

image:["data:image/png;base64,iVBORw...","data:image/png;base64,idfsd..."]

我想将此图像存储在Cassandra中。此jsonArray[String]-

映射到我的模型
case class ImageArray(
image: Array[String]
}

我已阅读到要在cassandra中存储图像,我需要ByteBuffer。因此,我使用ByteBuffer.wrap()将数组的数组不同索引转换为ByteBuffer。

ByteBuffer.wrap(model.image(0).getBytes()) //for the moment, I am taking only 1 image

我无法弄清楚如何将ByteBuffer转换回String。我可以像下面这样从Cassandra检索字节

(row.getBytes("image"))

以上内容给了我ByteBuffer。如何将其转换为String,以后可以用来创建Array[String]

1 个答案:

答案 0 :(得分:0)

尽管我能够解决它,但是该方法非常缓慢,因此我放弃了将图像存储为字节并将其存储为字符串(base64)的想法,因为这是我从服务器上获得的。

为了解决这个问题,我做了一些更改。

随着Cassandra了解列表,将数组更改为模型中的列表

case class ImageArray(
image: List[String]
}

通过创建自定义Reads-(JsPath \ "image").read[List[String]]

映射到图像列表的json数组或图像

cassandra中,用于存储图像数组的表架构为image list<blob>,

模型中有了列表后,我便使用List将其转换为String的{​​{1}}到List的{​​{1}}

上面,我获取了图像列表的第一个元素(一个字符串,它是索引0处图像的base64表示形式),使用Byte将其转换为字节,然后将.value("image",seqAsJavaList(((ByteBuffer.wrap(model.image(0).getBytes())).array().toList):::((ByteBuffer.wrap(model.image(1).getBytes())).array().toList)))转换为{{1} },然后将其转换为ByteBuffer.wrap。这给了我ByteBuffer作为第一张图片。我对image(1)重复此操作,然后使用Array将两个图像合并。然后,我使用List将此List[Byte] :::转换为Scala

注意:由于上述方法需要多次转换,因此这不是最佳方法。相反,我决定将图像存储为List [String]