Полезные команды RethinkDB для исследования данных
Биолог Акшай Чогуле, работающий с большими наборами данных, написал пост в блоге о полезных командах Unix для исследования данных, демонстрируя способы «запроса» данных из файлов с разделителями запятыми с помощью стандартных команд оболочки. Мы посчитали бы интересным создать аналогичную статью, используя ReQL в окне Data Explorer, демонстрируя, как его можно использовать для запросов ad hoc.
Акшай создал вымышленный набор данных о фильмах; мы будем использовать данные из рейтинга IMDb Top 250. (Обратите внимание, что мы зафиксировали эти данные 26 августа 2014 года, поэтому они могут отличаться, если вы проверите их сейчас.) Данные из IMDb в формате простого текста не имеют *никакого* формата, но мы превратили их в файл JSON, доступный по адресу http://rethinkdb.com/sample/top-250-ratings.json. (Для справки, мы сначала преобразовали их в файл с табуляцией, использовали rethinkdb import для добавления их в базу данных, исправили типы столбцов и повторно экспортировали их. Подробности см. в импорте данных).
Поскольку он доступен в сети, вы можете импортировать наш набор данных, просто создав таблицу и импортировав ее с помощью http. Просто выполните эти команды непосредственно в окне Data Explorer.
r.tableCreate('movies');
r.table('movies').insert(r.http('http://rethinkdb.com/sample/top-250-ratings.json'))
Data Explorer вернёт информацию об добавленных строках.
{
"deleted": 0 ,
"errors": 0 ,
"generated_keys": [
"bbf81f4d-2a6d-40bb-9b5d-b6e288cc8795" ,
"0d6054f4-12b0-4c2e-b221-881441c779c4" ,
...
] ,
"inserted": 253 ,
"replaced": 0 ,
"skipped": 0 ,
"unchanged": 0
}
Созданная таблица имеет шесть полей: автоматически сгенерированный первичный ключ (id), rank (рейтинг IMDb, 1–250), rating (по шкале от 1 до 10), title, votes, и year.
Получение лучшего фильма
Чтобы увидеть фильм номер один по версии IMDb, используйте filter({rank: 1}):
r.table('movies').filter({rank: 1})
[
{
"id": "bbf81f4d-2a6d-40bb-9b5d-b6e288cc8795" ,
"rank": 1 ,
"rating": 9.2 ,
"title": "The Shawshank Redemption" ,
"votes": 1262930 ,
"year": 1994
}
]
(«Шоушенк» многие годы остается любимым фильмом на IMDb. Примите это, Орсон Уэллс.)
Удаление дублированных документов
Возможно, вы заметили, что было вставлено 253 документа, а не 250. Возможно, у нас есть топ-253 фильма, или там скрываются несколько дубликатов. Мы можем использовать distinct для подсчета уникальных строк, но нам нужно удалить столбец id из запроса, так как все значения ID уникальны.
r.table('movies').without('id').distinct().count()
250
Чтобы получить список без дубликатов, просто опустите count.
r.table('movies').without('id').distinct()
Чтобы поместить эти данные в новую таблицу, оберните запрос в insert. Новые ID будут сгенерированы автоматически. Это также пример использования подзапросов с ReQL: легко передать результаты одного запроса в другой. (Ещё одна приятная особенность ReQL, которую мы уже видели, — это цепочка команд: вход одной команды часто является выходом предыдущей команды, аналогично конвейеру Unix.)
r.tableCreate('moviesUnique');
r.table('moviesUnique').insert(
r.table('movies').without('id').distinct()
)
Теперь с очищенным набором данных мы можем выполнить простые отчеты прямо в окне Data Explorer. (Возможно, вы захотите переключиться на режим просмотра таблицы для некоторых из них, а также можете добавить .without('id') в цепочку команд, чтобы «приукрасить» отображение таблицы, если хотите.)
Отображение 10 лучших фильмов…
r.table('moviesUnique').orderBy('rank').limit(10)
…и 10 худших
r.table('moviesUnique').orderBy(r.desc('rank')).limit(10)
(Это 10 худших из топ-250, так что они все равно довольно неплохие.)
Получение 1-го, 2-го, 6-го и последнего записей
r.table('moviesUnique').filter(function (doc) {
return r.expr([1, 2, 6, r.table('moviesUnique').max('rank')('rank')]).
contains(doc('rank'));
}).orderBy('rank');
Найти среднее количество голосов для 25 лучших фильмов
r.table('moviesUnique').orderBy('rank').limit(25).avg('votes')
Найти самый недавний фильм в топ-25
r.table('moviesUnique').orderBy('rank').limit(25).max('year')
Найти фильм с наивысшим рейтингом, набравший менее 100 000 голосов
r.table('moviesUnique').filter(r.row('votes').lt(100000)).min('rank')
Вы можете узнать больше о ReQL в статье Введение в ReQL или углубиться в документацию API.
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/reql-data-exploration/