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

斯特凡诺

我在cassandra DB上构建了结构,以存储OS数据的时间序列数据,例如服务,流程和其他信息。为了了解Cassandra在存储JSON数据以及通过CQL查询在有条件的情况下检索数据的方式,我更喜欢简化模型。因为在总模型DB中,我将拥有比report_object更复杂TYPE,例如hashMap数组的hashMap:类型, NETSTAT--> Object[n] --> {host:192.168.0.23, protocol: TCP ,LocalAddress : 0.0.0.0}因此NETSTAT类型将具有一个hashMap列表,其中将包含字段key-> value。为了简化,我选择显示以下架构:

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类内部使用以下查询注入了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)?
零323

为了能够使用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"}');

您将找到有关如何通过用户定义类型的字段过滤cassandra查询的更多详细信息和说明。

使用Spark暴露这些值时,可以使用filter on过滤这些值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这样的查询,但必须先提取整个表格,然后才能过滤数据。虽然目前尚不清楚您到底要实现什么目标,但是总体上不太可能是有用的结构。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章