Полезные команды RethinkDB для исследования данных
Биолог Акшай Чогуле, работающий с большими наборами данных, написал пост в блоге о полезных командах Unix для исследования данных, демонстрируя способы «запроса» данных в формате CSV с помощью общих команд оболочки. Мы посчитали бы интересным написать похожую статью, используя ReQL в окне Data Explorer, показывая, как его можно использовать для запросов ad hoc.
Акшай создал вымышленный набор данных о фильмах; мы будем использовать данные из топ-250 IMDb. (Обратите внимание, что мы зафиксировали эти данные 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/