Добро пожаловать во вторую часть нашей серии из трех статей о MongoDB и Hadoop. В первой части мы рассказали о Hadoop и о том, как его настроить. В этом посте мы рассмотрим пример Hive.
- Введение и настройка Hadoop и MongoDB
- Пример улья
- Пример искры и ключевые выводы
Для получения более подробной информации о сценарии использования см. Первый абзац части 1 .
Резюме
Вариант использования : объединение 1-минутных интервалов цен на акции в 5-минутные интервалы.
Вход :: 1-минутные интервалы цен на акции в базе данных MongoDB.
Простой анализ : выполняется в:
— Hive
— Spark.
Выход : 5-минутные интервалы цен на акции в Hadoop.
Пример улья
Я запустил следующий пример из командной строки Hive (просто набрал команду «hive» без параметров), а не из редактора Hue Cloudera, поскольку для этого потребовались бы дополнительные шаги установки. Я сразу заметил, что люди критикуют Hive за то, что все компилируется в MapReduce, что занимает много времени. Я запустил большинство вещей всего с 20 записями, чтобы запросы выполнялись быстро.
Это создает определение таблицы в Hive, которое соответствует структуре данных в MongoDB. MongoDB имеет динамическую схему для переменных форм данных, но Hive и SQL нуждаются в определении схемы.
CREATE EXTERNAL TABLE minute_bars ( id STRUCT, Symbol STRING, Timestamp STRING, Day INT, Open DOUBLE, High DOUBLE, Low DOUBLE, Close DOUBLE, Volume INT ) STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler' WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"_id", "Symbol":"Symbol", "Timestamp":"Timestamp", "Day":"Day", "Open":"Open", "High":"High", "Low":"Low", "Close":"Close", "Volume":"Volume"}') TBLPROPERTIES('mongo.uri'='mongodb://localhost:27017/marketdata.minbars');
Недавние изменения в репозитории Apache Hive делают необходимые сопоставления, даже если вы сохраняете имена полей одинаковыми. Это должно быть изменено в MongoDB Hadoop Connector в ближайшее время, если не к тому времени, когда вы прочитаете это.
Затем я выполнил следующую команду, чтобы создать таблицу Hive для 5-минутных баров:
CREATE TABLE five_minute_bars ( id STRUCT, Symbol STRING, Timestamp STRING, Open DOUBLE, High DOUBLE, Low DOUBLE, Close DOUBLE );
Этот оператор вставки использует оконные функции SQL для группировки 5-минутных периодов и определения OHLC для 5-минутного периода. Есть определенно другие способы сделать это, но вот один, который я понял. Группировка в SQL немного отличается от группировки в инфраструктуре агрегации MongoDB (в которой вы можете легко получить первую и последнюю группу), поэтому мне понадобилось некоторое время, чтобы вспомнить, как это сделать с помощью подзапроса.
Подзапрос берет каждую группу из 5 1-минутных записей / документов, сортирует их по времени и берет цены открытия, максимума, минимума и закрытия до этой записи за каждый 5-минутный период. Затем внешнее предложение WHERE выбирает последний 1-минутный бар в этом периоде (поскольку эта строка в подзапросе содержит правильную информацию OHLC для своего 5-минутного периода). Я определенно приветствую более простые для понимания запросы, но вы можете запустить подзапрос самостоятельно, чтобы увидеть, что он делает.
INSERT INTO TABLE five_minute_bars SELECT m.id, m.Symbol, m.OpenTime as Timestamp, m.Open, m.High, m.Low, m.Close FROM (SELECT id, Symbol, FIRST_VALUE(Timestamp) OVER ( PARTITION BY floor(unix_timestamp(Timestamp, 'yyyy-MM-dd HH:mm')/(5*60)) ORDER BY Timestamp) as OpenTime, LAST_VALUE(Timestamp) OVER ( PARTITION BY floor(unix_timestamp(Timestamp, 'yyyy-MM-dd HH:mm')/(5*60)) ORDER BY Timestamp) as CloseTime, FIRST_VALUE(Open) OVER ( PARTITION BY floor(unix_timestamp(Timestamp, 'yyyy-MM-dd HH:mm')/(5*60)) ORDER BY Timestamp) as Open, MAX(High) OVER ( PARTITION BY floor(unix_timestamp(Timestamp, 'yyyy-MM-dd HH:mm')/(5*60)) ORDER BY Timestamp) as High, MIN(Low) OVER ( PARTITION BY floor(unix_timestamp(Timestamp, 'yyyy-MM-dd HH:mm')/(5*60)) ORDER BY Timestamp) as Low, LAST_VALUE(Close) OVER ( PARTITION BY floor(unix_timestamp(Timestamp, 'yyyy-MM-dd HH:mm')/(5*60)) ORDER BY Timestamp) as Close FROM minute_bars) as m WHERE unix_timestamp(m.CloseTime, 'yyyy-MM-dd HH:mm') - unix_timestamp(m.OpenTime, 'yyyy-MM-dd HH:mm') = 60*4;
Я определенно вижу выгоду от возможности использовать SQL для доступа к данным в MongoDB и, возможно, в других базах данных и форматах файлов, все с теми же командами, в то время как различия в отображении обрабатываются в объявлениях таблиц. Недостатком является то, что задержка довольно высока, но это может быть сделано с возможностью масштабирования по горизонтали между многими узлами. Я думаю, что это привлекательность Hive для большинства людей — они могут масштабироваться до очень больших объемов данных с использованием традиционного SQL, и задержка не является главной проблемой.
Пост № 3 в этой серии блогов показывает похожие примеры использования Spark.
- Введение и настройка Hadoop и MongoDB
- Пример улья
- Пример искры и ключевые выводы
Чтобы узнать больше, посмотрите наше видео на MongoDB и Hadoop. Мы подробно расскажем о соединителе MongoDB для Hadoop и о том, как его можно применять для получения новых бизнес-идей.