Я делаю анализ сигналов с помощью Hadoop/Spark, и мне нужна помощь в том, как структурировать весь процесс.
Сигналы теперь хранятся в базе данных, которую мы будем читать с помощью Sqoop и будут преобразованы в файлы на HDFS, с схемой, подобной:
<Measure ID> <Source ID> <Measure timestamp> <Signal values>
где значения сигнала представляют собой только строку, состоящую из чисел с запятой с запятой с плавающей запятой.
000123 S001 2015/04/22T10:00:00.000Z 0.0,1.0,200.0,30.0 ... 100.0
000124 S001 2015/04/22T10:05:23.245Z 0.0,4.0,250.0,35.0 ... 10.0
...
000126 S003 2015/04/22T16:00:00.034Z 0.0,0.0,200.0,00.0 ... 600.0
Мы хотели бы написать интерактивные/пакетные запросы:
применять функции агрегации по значениям сигнала
SELECT *
FROM SIGNALS
WHERE MAX(VALUES) > 1000.0
Чтобы выбрать сигналы с пиком более 1000,0.
применить агрегацию по агрегации
SELECT SOURCEID, MAX(VALUES)
FROM SIGNALS
GROUP BY SOURCEID
HAVING MAX(MAX(VALUES)) > 1500.0
Чтобы выбрать источники, имеющие хотя бы один сигнал, превышающий 1500,0.
применять определенные пользователем функции над образцами
SELECT *
FROM SIGNALS
WHERE MAX(LOW_BAND_FILTER("5.0 KHz", VALUES)) > 100.0)
чтобы выбрать сигналы, которые после фильтрации на 5.0 кГц имеют по меньшей мере значение более 100.0.
Нам нужна помощь, чтобы:
- найдите правильный формат файла для записи данных сигналов на HDFS. Я подумал об Apache Parquet. Как бы вы структурировали данные?
- понять правильный подход к анализу данных: лучше создавать разные наборы данных (например, обрабатывать данные с помощью Spark и сохраняющиеся результаты на HDFS) или пытаться делать все в время запроса из исходного набора данных?
- Является ли улов хорошим инструментом для создания таких запросов, которые я написал? Мы работаем на Cloudera Enterprise Hadoop, поэтому мы также можем использовать Impala.
- В случае, если мы создаем другой исходный набор данных из исходного, как мы можем отслеживать происхождение данных, то есть знать, как данные были сгенерированы из исходной версии?
Большое спасибо!