Полезные команды RethinkDB для исследования данных
Биолог Акшай Чогоул, работающий с большими наборами данных, написал статью в блоге о полезных командах Unix для исследования данных, показывая способы «запроса» данных из файлов с разделителями запятыми с помощью обычных команд оболочки. Мы посчитали интересным написать аналогичную статью, используя ReQL в обозревателе данных, показывая, как его можно использовать для запросов ad hoc.
Акшай создал вымышленный набор данных о фильмах; мы будем использовать данные из Топ-250 IMDb. (Обратите внимание, что мы зафиксировали эти данные 26 августа 2014 года, поэтому они могут отличаться, если вы проверите их сейчас.) Данные из IMDb в текстовом формате не имеют *никакого* формата, но мы преобразовали их в файл JSON, доступный по адресу http://rethinkdb.com/sample/top-250-ratings.json. (Для справки, сначала мы преобразовали их в файл с табуляцией, использовали rethinkdb import для внесения их в базу данных, исправили типы столбцов и повторно экспортировали их. Подробности см. в разделе Импорт ваших данных).
Поскольку эти данные доступны в интернете, вы можете импортировать наш пример набора данных, просто создав таблицу и импортировав ее с помощью http. Просто выполните эти команды непосредственно в обозревателе данных.
r.tableCreate('movies');
r.table('movies').insert(r.http('http://rethinkdb.com/sample/top-250-ratings.json'))
Обозреватель данных вернет информацию о вставленных строках.
{
"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()
)
Теперь, с «чистым» набором данных, мы можем выполнять простые отчеты прямо в обозревателе данных. (Возможно, вам захочется переключиться на представление таблицы для некоторых из них, и вы также можете добавить .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/