如何使用cql将cassandra map记录从blob转换为文本?

e4yzc0pl  于 12个月前  发布在  Cassandra
关注(0)|答案(1)|浏览(194)

我有一个表,其模式如下

PK" text,

"SK" text,

":attrs" map<text, blob>,

PRIMARY KEY ("PK", "SK")

字符串
我想得到我插入到这个表中的记录的字符串值?目前我得到的是十六进制值,因为它是一个blob。
类似这样的东西,但我不能得到正确的语法

select blobAsText(":attrs"['key_name']) from my_table

u3r8eeie

u3r8eeie1#

首先,我甚至不知道:attrs作为列名是否支持使用除下划线(_)以外的特殊字符,但让我们暂时搁置它。
blobAsText native cql function不支持您在此尝试的集合列类型。
看到这里作为一个例子,这下面的作品:

token@cqlsh:baselines> create table if not exists so_blob_as(i int primary key, b blob);
token@cqlsh:baselines> insert into so_blob_as(i,b) values (1,textasblob('1'));
token@cqlsh:baselines> select * from so_blob_as ;

 i | b
---+------
 1 | 0x31

(1 rows)
token@cqlsh:baselines> select i, blobastext(b) from so_blob_as ;

 i | system.blobastext(b)
---+----------------------
 1 |                    1

(1 rows)

字符串
然而,这就是集合的工作原理,

token@cqlsh:baselines> alter table so_blob_as add m_tb map<text,blob>;
token@cqlsh:baselines> desc so_blob_as ;

CREATE TABLE baselines.so_blob_as (
    i int PRIMARY KEY,
    b blob,
    m_tb map<text, blob>
)...

token@cqlsh:baselines> update so_blob_as set m_tb = {'1': textasblob('1')} where i = 1;
token@cqlsh:baselines> SELECT * FROM so_blob_as ;

 i | b    | m_tb
---+------+-------------
 1 | 0x31 | {'1': 0x31}

(1 rows)

>>>This below will work<<<
token@cqlsh:baselines> SELECT i,blobastext(b),blobastext(m_tb) FROM so_blob_as ;

 i | system.blobastext(b) | system.blobastext(m_tb)
---+----------------------+----------------------------------------------------
 1 |                    1 | \x00\x00\x00\x01\x00\x00\x00\x011\x00\x00\x00\x011

(1 rows)


如果你想要一个给定键的值并转换它,你需要做at the application side

相关问题