Cassandra DB上存储的JSON对象上的查询spark
我在cassandra DB上构建了这个结构来存储操作系统数据的时间序列数据,比如服务、进程和其他信息。为了理解如何使用Cassandra存储JSON数据并通过CQL查询检索数据,我更倾向于简化模型。因为在total model DB中,我将使用比report_对象更复杂的类型,例如hashMap数组的hashMap: 键入Cassandra DB上存储的JSON对象上的查询spark,json,apache-spark,cassandra,time-series,Json,Apache Spark,Cassandra,Time Series,我在cassandra DB上构建了这个结构来存储操作系统数据的时间序列数据,比如服务、进程和其他信息。为了理解如何使用Cassandra存储JSON数据并通过CQL查询检索数据,我更倾向于简化模型。因为在total model DB中,我将使用比report_对象更复杂的类型,例如hashMap数组的hashMap: 键入NETSTAT-->对象[n]-->{host:192.168.0.23,协议:TCP,LocalAddress:0.0.0} 因此,NETSTAT类型将有一个hashMap
NETSTAT-->对象[n]-->{host:192.168.0.23,协议:TCP,LocalAddress:0.0.0}
因此,NETSTAT类型将有一个hashMaps列表,其中包含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>);
我用上面的查询处理了其他数据。
澄清我的概念的问题有:
-我想使用检查定义的内部类型的条件进行查询,是否可以使用CQL,或者是否有必要使用spark SQL
- 设计数据库模型是否适合这个目的(因为我已经从RDBMS传递到了DB NoSQL)
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"}');
您将在中找到更多详细信息和解释
当使用Spark曝光时,可使用CassandraTableScanRDD上的过滤器过滤这些值:
val rdd = sc.cassandraTable("test", "test")
rdd.filter(row =>
row.getUDTValue("report").getString("rscript") == "Main")
或其中/过滤器位于数据帧上
:
df.where($"report.rscript" === "Main")
尽管使用Spark这样的查询,但必须先获取整个表,然后才能过滤数据。虽然目前还不清楚您到底想要实现什么,但这不太可能是一个有用的结构。是否需要Scala语言来查询数据?使用Java语言可以吗?当您用equals替换=
时,DataFrame API应该可以立即运行CassandraRDD
将需要一个自定义函数,但我看不出它不起作用的任何原因。能否为我提供一个教程或指南,通过Java语言的Cassandra结构中的查询对检索数据进行测试?谢谢
df.where($"report.rscript" === "Main")