【问题标题】:How to use blob data type to save base64(image) in Cassandra?如何使用 blob 数据类型在 Cassandra 中保存 base64(图像)?
【发布时间】:2017-12-04 16:14:14
【问题描述】:

如何使用 blob 数据类型在 Cassandra 中保存 base64(image) ?

这是我的创建表查询:

CREATE TABLE IF NOT EXISTS xadvisor.session ( user_id varchar, images set <blob>, PRIMARY KEY(user_id));

这是我的插入查询:

INSERT INTO xadvisor.session ( user_id , images) VALUES ('XAU1', {\'"+base64+"\'});

base64是从我的本地图片实现的:

var base64 = fs.readFileSync(path.resolve(__dirname + '/../tmp/assets/images_png/capture00001.png'), 'base64');

我收到这样的错误: {"name":"ResponseError","stack":"Error: Invalid set literal for images: value 'iVBORw0KGgoAAAANSUhEUgAABHQAAAHuCAYAAAD+yVs........

提前感谢您的关注和建议:)

【问题讨论】:

    标签: node.js cassandra base64 blob cql


    【解决方案1】:

    在 datastax 的 nodejs 驱动程序中,blob 等于缓冲区,请参见此处: http://datastax.github.io/nodejs-driver/features/datatypes/

    但如果您打算使用 base64 - 您只是在处理一些文本,根本不需要使用 blob。

    提醒:保持“blob”足够小以提高性能(个位数兆字节)。

    更新:哦,我忽略了设置。

    您是否遇到任何错误?那么也请提供。

    集合在 CQL 中受到限制 - 值必须小于 64kb。 收藏(集):收藏上限:~20亿(231);值大小: 65535(216-1)

    http://docs.datastax.com/en/cql/3.3/cql/cql_reference/refLimits.html

    更新:

    typeAsBlob() 可能是你的朋友(见http://docs.datastax.com/en/cql/3.3/cql/cql_reference/blob_r.html)——例如textAsBlob():

    cqlsh:demo> DESCRIBE blob ;
    
    CREATE TABLE demo.blob (
        user_id text PRIMARY KEY,
        payload blob
    ) WITH bloom_filter_fp_chance = 0.01
        AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
        AND comment = ''
        AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
        AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 864000
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND min_index_interval = 128
        AND read_repair_chance = 0.0
        AND speculative_retry = '99.0PERCENTILE';
    
    cqlsh:demo> INSERT INTO blob (user_id, payload) VALUES ('demo_user','YXNsa2RramFzZAo=');
    InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid STRING constant (YXNsa2RramFzZAo=) for "payload" of type blob"
    cqlsh:demo> INSERT INTO blob (user_id, payload) VALUES ('demo_user',textAsblob('YXNsa2RramFzZAo='));
    cqlsh:demo> SELECT * FROM blob ;
    
     user_id   | payload
    -----------+------------------------------------
     demo_user | 0x59584e7361325272616d467a5a416f3d
    
    (1 rows)
    cqlsh:demo>
    

    因为 base64 编码的图像只是一个字符串,您也可以使用文本。为了存储您的图像,构建一个单独的表来保存它们,user_id 作为分区键,唯一标识符(可能是哈希)作为集群列:

    cqlsh> USE demo ;
    cqlsh:demo> DESCRIBE TABLE demo.images ;
    
    CREATE TABLE demo.images (
        user_id text,
        image_id text,
        image_payload text,
        PRIMARY KEY (user_id, image_id)
    ) WITH CLUSTERING ORDER BY (image_id ASC)
        AND bloom_filter_fp_chance = 0.01
        AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
        AND comment = ''
        AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
        AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 864000
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND min_index_interval = 128
        AND read_repair_chance = 0.0
        AND speculative_retry = '99.0PERCENTILE';
    
    cqlsh:demo> INSERT INTO demo.images (user_id, image_id, image_payload) VALUES ('demo_user1', 'img000.png', 'YWRsa2tqYXNkaGpzZAo=');
    cqlsh:demo> INSERT INTO demo.images (user_id, image_id, image_payload) VALUES ('demo_user1', 'img002.png', 'YWRsa2tqYXNkaGpzZAo=');
    cqlsh:demo> INSERT INTO demo.images (user_id, image_id, image_payload) VALUES ('demo_user1', 'img017.png', 'YWRsa2tqYXNkaGpzZAo=');
    cqlsh:demo> INSERT INTO demo.images (user_id, image_id, image_payload) VALUES ('demo_user2', 'img001.png', 'YWRsa2tqYXNkaGpzZAo=');
    cqlsh:demo> INSERT INTO demo.images (user_id, image_id, image_payload) VALUES ('demo_user2', 'img002.png', 'YWRsa2tqYXNkaGpzZAo=');
    cqlsh:demo> SELECT image_id, image_payload FROM demo.images WHERE user_id = 'demo_user1';
    
     image_id   | image_payload
    ------------+----------------------
     img000.png | YWRsa2tqYXNkaGpzZAo=
     img002.png | YWRsa2tqYXNkaGpzZAo=
     img017.png | YWRsa2tqYXNkaGpzZAo=
    
    (3 rows)
    cqlsh:demo>
    

    【讨论】:

    • 我重新编辑了我的问题并添加了我从控制台得到的错误。我意识到,考虑到存储限制,在这种情况下使用 set 可能不是一个合适的选择。在这种情况下,我需要在 column_name (images) 中存储许多图像,您能建议我另一种实现方式吗?
    猜你喜欢
    • 2014-03-09
    • 2014-10-01
    • 2022-12-22
    • 2020-09-03
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多