查询存储在Cassandra DB上的JSON对象的spark

时间:2016-03-13 15:14:31

标签: json apache-spark cassandra time-series

我在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?

  • 设计数据库模型是否适用于此目的(因为我已经从RDBMS传递到DB NoSQL)?

1 个答案:

答案 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进行查询,但必须先获取整个表,然后才能过滤数据。虽然目前尚不清楚你究竟想要实现什么目标,但这种结构一般不太可能。但