2016-03-13 2 views
3

Я построил структуру на базе данных cassandra для хранения данных временных рядов данных ОС, таких как службы, процесс и другая информация. Чтобы понять, как работает Cassandra о хранении данных JSON и извлечении данных по запросам CQL с условием, я предпочел упростить модель. Потому что в общей модели DB я буду иметь TYPE более сложной, чем report_object как HashMap из массива HashMap, например: ТипNETSTAT--> Object[n] --> {host:192.168.0.23, protocol: TCP ,LocalAddress : 0.0.0.0} так Тип NETSTAT будет иметь список HashMaps, которые будут содержать поля ключа - > значение. Для Simplify Я выбрал, чтобы показать следующую схему:Запрос искры на объекте JSON, хранящемся на Cassandra DB

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>); 

Внутри таблицы I injectioned данные в формате JSON с последующим запросом внутри класса Java:

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"}}'; 

Я inectioned других данных с запросом выше , Вопросы для разъяснения моих концепций: - Я хотел бы делать запросы с условиями, которые проверяются внутри определенного ТИПА, возможно ли это с помощью CQL или необходимо использовать искру SQL?

  • Является ли дизайн DB-модели подходящей для этой цели (потому что я перешел от РСУБД к DB NoSQL)?

ответ

2

Чтобы иметь возможность запроса User Defined Type с помощью Кассандру вам придется создать индекс первого:

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") 

Хотя запрос, как это с помощью искры всей таблицы должен быть извлечен, прежде чем данные могут быть отфильтрованы. Пока неясно, чего именно вы пытаетесь достичь, но вряд ли это будет полезной структурой в целом.

+0

Нужен ли язык Scala для запроса данных? Возможно ли это с языком Java? – Stefano

+0

API DataFrame должен работать из коробки при замене '===' равными. 'CassandraRDD' потребует пользовательскую функцию, но я не вижу причин, почему она может не работать. – zero323

+0

Не могли бы предоставить мне учебник или руководство для проведения теста для извлечения данных по запросу из моей структуры в Cassandra на языке Java? благодаря – Stefano

Смежные вопросы