Spec-Zone.ru › RethinkDB java

Полезные команды RethinkDB для исследования данных

Иллюстрация разведки данных

Акшай Чогуле, биолог, работающий с большими наборами данных, написал статью в блоге о полезных командах Unix для исследования данных, демонстрируя способы «запроса» наборов данных в формате CSV с помощью обычных команд оболочки. Мы посчитали бы интересным написать аналогичную статью, используя 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API