Набор данных кулинарных рецептов
Набор данных кулинарных рецептов от 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 │