Набор данных кулинарных рецептов
Набор данных кулинарных рецептов от RecipeNLG доступен для загрузки здесь. Он содержит 2.2 миллиона рецептов, а его размер чуть меньше 1 ГБ.
Загрузите и распакуйте набор данных
- Перейдите на страницу загрузки https://recipenlg.cs.put.poznan.pl/dataset.
- Примите Правила и условия и скачайте zip-архив с набором данных.
- Распакуйте zip-архив и вы получите файл
full_dataset.csv
.
Создайте таблицу
Запустите клиент ClickHouse и выполните следующий запрос для создания таблицы recipes
:
CREATE TABLE recipes
(
title String,
ingredients Array(String),
directions Array(String),
link String,
source LowCardinality(String),
NER Array(String)
) ENGINE = MergeTree ORDER BY title;
Добавьте данные в таблицу
Чтобы добавить данные из файла full_dataset.csv
в таблицу recipes
, выполните команду:
clickhouse-client --query "
INSERT INTO recipes
SELECT
title,
JSONExtract(ingredients, 'Array(String)'),
JSONExtract(directions, 'Array(String)'),
link,
source,
JSONExtract(NER, 'Array(String)')
FROM input('num UInt32, title String, ingredients String, directions String, link String, source LowCardinality(String), NER String')
FORMAT CSVWithNames
" --input_format_with_names_use_header 0 --format_csv_allow_single_quote 0 --input_format_allow_errors_num 10 < full_dataset.csv
Это один из примеров анализа пользовательских CSV-файлов с применением специальных настроек.
Пояснение:
- набор данных представлен в формате CSV и требует некоторой предварительной обработки при вставке. Для предварительной обработки используется табличная функция input;
- структура CSV-файла задается в аргументе табличной функции
input
; - поле
num
(номер строки) не нужно — оно считывается из файла, но игнорируется; - при загрузке используется
FORMAT CSVWithNames
, но заголовок в CSV будет проигнорирован (параметром командной строки--input_format_with_names_use_header 0
), поскольку заголовок не содержит имени первого поля; - в файле CSV для разделения строк используются только двойные кавычки. Но некоторые строки не заключены в двойные кавычки, и чтобы одинарная кавычка не рассматривалась как заключающая, используется параметр
--format_csv_allow_single_quote 0
; - некоторые строки из CSV не могут быть считаны корректно, поскольку они начинаются с символов
\M/
, тогда как в CSV начинаться с обратной косой черты могут только символы\N
, которые распознаются какNULL
в SQL. Поэтому используется параметр--input_format_allow_errors_num 10
, разрешающий пропустить до десяти некорректных записей; - массивы
ingredients
,directions
иNER
представлены в необычном виде: они сериализуются в строку формата JSON, а затем помещаются в CSV — тогда они могут считываться и обрабатываться как обычные строки (String
). Чтобы преобразовать строку в массив, используется функция JSONExtract.
Проверьте добавленные данные
Чтобы проверить добавленные данные, подсчитайте количество строк в таблице:
Запрос:
SELECT count() FROM recipes;
Результат:
┌─count()─┐
│ 2231141 │
└─────────┘
Примеры запросов
Самые упоминаемые ингридиенты в рецептах:
В этом примере вы узнаете, как развернуть массив в набор строк с помощью функции arrayJoin.
Запрос:
SELECT
arrayJoin(NER) AS k,
count() AS c
FROM recipes
GROUP BY k
ORDER BY c DESC
LIMIT 50
Результат:
┌─k────────────────────┬──────c─┐
│ salt │ 890741 │
│ sugar │ 620027 │
│ butter │ 493823 │
│ flour │ 466110 │
│ eggs │ 401276 │
│ onion │ 372469 │
│ garlic │ 358364 │
│ milk │ 346769 │
│ water │ 326092 │
│ vanilla │ 270381 │
│ olive oil │ 197877 │
│ pepper │ 179305 │
│ brown sugar │ 174447 │
│ tomatoes │ 163933 │
│ egg │ 160507 │
│ baking powder │ 148277 │
│ lemon juice │ 146414 │
│ Salt │ 122557 │
│ cinnamon │ 117927 │