Cassandra:如何在cqlsh中读取无模式列或为什么不可能?

时间:2017-01-13 13:56:21

标签: cassandra cql cqlsh cassandra-cli

我们使用Cassandra作为数据库,大多数表具有模式(并通过CQL创建),还有一些通过Thrift API定义的旧表,即使用COMPACT STORAGE并具有相当多的动态列。

一个典型的例子是Accounts表,其中有许多标签,标志等插入到用户数据中。 代码可以轻松地获取,解码和操作这些动态列的Blob。例如。通过cassandra-cli,您可以将一些帐户列为:

RowKey: bfc4c12b-abcd-defg-90ca-0a56870596e1
=> (name=country, value=US, timestamp=1384489319659000)
=> (name=email, value=someperson@goodserver.org, timestamp=1384489425826000)
=> (name=ourCode, value=12345, timestamp=1384489319550005)
=> (name=flag_ab_notice_twoweeks, value=text, timestamp=1385943698049000)
=> (name=flag_client, value=4d6f7a696c6c612f352e3020286950686f6e653b20435055206950686f6e65204f5320375f305f33206c696b65204d6163204f53205829204170706c655765624b69742f3533372e35312e3120284b48544d4c2c206c696b65204765636b6f29204d6f62696c652f313142353131205468696e674c696e6b2f312e372e312e313233, timestamp=1384489319637000)
=> (name=flag_orgindustry, value=, timestamp=1435153936346000)
=> (name=flag_orgsize, value=736d616c6c, timestamp=1435153936458000)
=> (name=flag_orgtype, value=5363686f6f6c, timestamp=1435153936450000)
=> (name=flag_registeredWith, value=email, timestamp=1384489319617000)
=> (name=flag_registrationFunnel, value=api, timestamp=1384489319601000)
=> (name=flag_statsEmails, value=true, timestamp=1384489322779000)
=> (name=lastTOSApproved, value=0000014259fe7ced, timestamp=1384489319661000)
=> (name=name, value=John, timestamp=1384489425826001)
=> (name=password, value=12345678, timestamp=1384489425826002)
=> (name=primaryId, value=bfc4c12b-abcd-defg-90ca-0a56870596e1, timestamp=1384489319550001)
=> (name=roles, value=user, timestamp=1384489319550002)
=> (name=salt, value=123456789, timestamp=1384489425826003)

当我通过CQL查看相同的数据时,我可以看到一些列(用模式定义的那些)并且看不到另一个列(例如列" salt"在我的情况下,最初由a创建使用Hector驱动程序和HFactory.createColumn("salt", byteArrayOfAUtf8StringValue)的Java客户端。好吧,cqlsh无法显示动态的thrift创建的列名称,例如在https://www.pythian.com/blog/effective-approach-migrate-dynamic-thrift-data-cql-part-2/,但我仍然无法理解。

问题

  1. 为什么casandra-cli能够显示出这种动态销售的名称?名字在哪里"盐"存储
  2. 为什么cqlsh不能使用相同的数据源来显示单元格标题/值(至少以非解码的方式)?
  3. 或者我可以以某种方式指示cqlsh向我显示给定动态单元格的值吗?也许类似于`SELECT DECODE_DYNAMIC_COLUMN(" salt"," String")FROM" Accoutns" WHERE ...&#34 ;?这样可以简化维护工作,因为每次我需要检查一些内容时,我都不必编写Java包装器。
  4. 祝你好运, 阿尔乔姆。

0 个答案:

没有答案