我正在Cassandra中尝试我的第一个'Helloworld'应用程序。每当我尝试将任何数据添加到我的键空间列系列时,都会收到此错误:
[default@MyKeyspace] set User['ehewitt'] ['fname']='Eben';
org.apache.cassandra.serializers.MarshalException: cannot parse 'fname' as hex bytes
尽管我已经执行了
[default@MyKeyspace] assume Users keys as utf8;
所以上面的命令似乎根本没有任何效果。如何解决此问题?
>Cassandra假设列为字节。
检查与
help assume;
assume User keys as ascii;
assume User comparator as ascii;
assume User validator as ascii;
assume User sub_comparator as ascii;
set User['ehewitt']['fname']='Eben';
Value inserted.
Elapsed time: 216 msec(s).
我有类似的问题,但 cli 告诉我该值是无法解析的值。
set game_outcome['1']['userId']='123asdasd';
cannot parse '123asdasd' as hex bytes
所以我尝试像这样使用 utf8 函数:
set game_outcome['1']['userId']=utf8('123asdasd');
cannot parse '123asdasd' as hex bytes
尝试
set User['ehewitt'] [utf8('fname')]='Eben'
我试图使用这样的假设
assume validator keys as utf8;
validator not found in current keyspace.
但正如你所看到的,它也没有那么好用!
我希望这个答案有所帮助。
启动命令行界面
您可以使用 Cassandra 安装中的 bin/cassandra-cli 脚本启动 CLI(在 Windows 上的 bin\cassandra-cli.bat(。如果您正在评估本地 cassandra 节点,请确保在启动 CLI 之前已正确配置并成功启动该节点。
如果成功,您将看到类似于以下内容的输出:
Welcome to cassandra CLI.
Type 'help;' or '?' for help. Type 'quit;' or 'exit;' to quit.
然后,必须指定要连接到的系统:
connect localhost/9160;
创建密钥空间
我们首先创建一个键空间来运行我们的示例。
create keyspace Twissandra;
为用户选择密钥空间
然后,我们必须选择示例键空间作为新上下文,然后才能运行任何查询。
use Twissandra;
创建列
然后我们可以创建一个要使用的列。
create column family User with comparator = UTF8Type;
要使后面的示例正常工作,还必须使用以下命令更新架构。这将设置名字和姓氏的返回类型,以使它们可读。它还将为年龄字段添加和索引,以便您使用用户名字段筛选获取。
update column family User with
column_metadata =
[
{column_name: first, validation_class: UTF8Type},
{column_name: last, validation_class: UTF8Type},
{column_name: age, validation_class: UTF8Type, index_type: KEYS}
];
添加数据
要将我们想要的数据添加到新列中,我们必须首先指定默认键类型,否则我们必须使用 [utf8('keyname(] 格式为每个键指定它,如果您有混合键类型,这可能是可取的,但使简单情况更难阅读。
因此,我们运行以下命令,该命令将持续您的 cli 会话的长度。退出并重新启动时,我们必须再次运行它。
assume User keys as utf8;
然后我们添加我们的数据。
set User['jsmith']['first'] = 'John';
set User['jsmith']['last'] = 'Smith';
set User['jsmith']['age'] = '38';
如果您收到这样的错误,无法将"John"解析为十六进制字节,则可能是您尚未设置默认键类型,或者尚未更新架构,如创建列示例中所示。
更新数据
如果我们需要更新一个值,我们只需再次设置它。
set User['jsmith']['first'] = 'Jack';
获取数据
现在让我们回顾一下 jsmith 行,看看它包含什么:
get User['jsmith'];
get 命令使用 API#get_slice
查询数据
get User where age = '12';