我在cassandra DB上构建了结构,用于存储OS数据的时间序列数据,如服务,进程和其他信息。要了解如何使用Cassandra来存储JSON数据并通过CQL查询检索数据,条件我更喜欢简化模型。因为在整个模型DB中,我会比使用hashMap数组的hashMap更复杂的 TYPE ,例如:
类型 NETSTAT--> Object[n] --> {host:192.168.0.23, protocol: TCP ,LocalAddress : 0.0.0.0}
所以类型NETSTAT将有一个hashMaps列表,其中包含字段key - >值。
为简化起见,我选择显示以下模式:
CREATE TYPE report_object (RTIME varchar, RMINORVER int, RUSER varchar, RLANG varchar, RSCRIPT varchar, RMAJORVER int, RHOST varchar, RPATH varchar);
CREATE TABLE test (
REPORTUUID uuid PRIMARY KEY,
report frozen<report_object>);
在表格中,我使用java class中的后续查询注入了JSON数据:
INSERT INTO test JSON '{"REPORTUUID": "9fb21fb9-333e-4017-ab77-0fa6ee1e20e3" ,"REPORT":{"RTIME":"6/MAR/2016 6:0:0 PM","RMINORVER":0,"RUSER":"Administrator","RLANG":"vbs","RSCRIPT":"Main","RMAJORVER":5,"RHOST":"WIN-SAPV9MUEMNS","RPATH":"C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\IXP000.TMP"}}';
我在上面的查询中使用了其他数据。 澄清我的概念的问题是: - 我想用查询TYPE定义的条件进行查询,是否可以使用CQL或者是否需要使用spark SQL?
答案 0 :(得分:2)
为了能够使用Cassandra查询用户定义类型,您必须首先创建索引:
CREATE INDEX on test.test(report);
但它只允许基于完整文档的谓词:
SELECT * FROM test
WHERE report=fromJson('{"RTIME":"6/MAR/2016 6:0:0 PM","RMINORVER":0,"RUSER":"Administrator","RLANG":"vbs","RSCRIPT":"Main","RMAJORVER":5,"RHOST":"WIN-SAPV9MUEMNS","RPATH":"C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\IXP000.TMP"}');
您可以在how to filter cassandra query by a field in user defined type
中找到更多详细信息和说明使用Spark公开时,可以使用CassandraTableScanRDD
上的过滤器过滤这些值:
val rdd = sc.cassandraTable("test", "test")
rdd.filter(row =>
row.getUDTValue("report").getString("rscript") == "Main")
在where
上或filter
/ DataFrame
:
df.where($"report.rscript" === "Main")
尽管使用Spark进行查询,但必须先获取整个表,然后才能过滤数据。虽然目前尚不清楚你究竟想要实现什么目标,但这种结构一般不太可能。但