> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Загрузка данных из BigQuery в ClickHouse

> Как загрузить данные из BigQuery в ClickHouse

*Это руководство подходит для ClickHouse Cloud и самоуправляемого ClickHouse v23.5+.*

В этом руководстве показано, как перенести данные из [BigQuery](https://cloud.google.com/bigquery) в ClickHouse.

Сначала мы экспортируем таблицу в [объектное хранилище Google (GCS)](https://cloud.google.com/storage), а затем импортируем эти данные в [ClickHouse Cloud](https://clickhouse.com/cloud). Эти шаги нужно повторить для каждой таблицы, которую вы хотите перенести из BigQuery в ClickHouse.

<div id="how-long-will-exporting-data-to-clickhouse-take">
  ## Сколько времени занимает экспорт данных в ClickHouse?
</div>

Время экспорта данных из BigQuery в ClickHouse зависит от размера вашего набора данных. Для сравнения: экспорт [общедоступного набора данных Ethereum объёмом 4 ТБ](https://cloud.google.com/blog/products/data-analytics/ethereum-bigquery-public-dataset-smart-contract-analytics) из BigQuery в ClickHouse по этому руководству занимает около часа.

| Таблица                                                                                           | Строки        | Экспортировано файлов | Объём данных | Экспорт из BigQuery | Время слотов | Импорт в ClickHouse |
| ------------------------------------------------------------------------------------------------- | ------------- | --------------------- | ------------ | ------------------- | ------------ | ------------------- |
| [blocks](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/blocks.md)             | 16,569,489    | 73                    | 14.53GB      | 23 сек              | 37 мин       | 15.4 сек            |
| [transactions](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/transactions.md) | 1,864,514,414 | 5169                  | 957GB        | 1 мин 38 сек        | 1 дн 8 ч     | 18 мин 5 сек        |
| [traces](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/traces.md)             | 6,325,819,306 | 17,985                | 2.896TB      | 5 мин 46 сек        | 5 дн 19 ч    | 34 мин 55 сек       |
| [contracts](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/contracts.md)       | 57,225,837    | 350                   | 45.35GB      | 16 сек              | 1 ч 51 мин   | 39.4 сек            |
| Итого                                                                                             | 8.26 млрд     | 23,577                | 3.982TB      | 8 мин 3 сек         | > 6 дн 5 ч   | 53 мин 45 сек       |

<Steps>
  <Step>
    ## Экспорт данных таблицы в GCS

    На этом шаге мы используем [рабочее пространство SQL в BigQuery](https://cloud.google.com/bigquery/docs/bigquery-web-ui) для выполнения SQL-команд. Ниже показано, как экспортировать таблицу BigQuery `mytable` в бакет GCS с помощью оператора [`EXPORT DATA`](https://cloud.google.com/bigquery/docs/reference/standard-sql/other-statements).

    ```sql theme={null}
    DECLARE export_path STRING;
    DECLARE n INT64;
    DECLARE i INT64;
    SET i = 0;

    -- Рекомендуем устанавливать n равным количеству миллиардов строк. Например, для 5 миллиардов строк: n = 5
    SET n = 100;

    WHILE i < n DO
      SET export_path = CONCAT('gs://mybucket/mytable/', i,'-*.parquet');
      EXPORT DATA
        OPTIONS (
          uri = export_path,
          format = 'PARQUET',
          overwrite = true
        )
      AS (
        SELECT * FROM mytable WHERE export_id = i
      );
      SET i = i + 1;
    END WHILE;
    ```

    В приведённом выше запросе мы экспортируем нашу таблицу BigQuery в [формат данных Parquet](https://parquet.apache.org/). В параметре `uri` также используется символ `*`. Это гарантирует, что результат будет разбит на несколько файлов с численно возрастающим суффиксом, если объём экспорта превысит 1 ГБ данных.

    У этого подхода есть ряд преимуществ:

    * Google позволяет бесплатно экспортировать в GCS до 50 ТБ в день. Пользователи платят только за хранение в GCS.
    * При экспорте автоматически создаётся несколько файлов, при этом размер каждого не превышает 1 ГБ данных таблицы. Это полезно для ClickHouse, поскольку позволяет распараллелить импорт.
    * Parquet как столбцово-ориентированный формат лучше подходит для обмена данными, поскольку он изначально сжат и позволяет BigQuery быстрее выполнять экспорт, а ClickHouse — запросы
  </Step>

  <Step>
    ## Импорт данных из GCS в ClickHouse

    После завершения экспорта эти данные можно импортировать в таблицу ClickHouse. Для выполнения приведённых ниже команд можно использовать [консоль ClickHouse SQL](/ru/products/cloud/features/sql-console-features/sql-console) или [`clickhouse-client`](/ru/concepts/features/interfaces/cli).

    Сначала необходимо [создать таблицу](/ru/reference/statements/create/table) в ClickHouse:

    ```sql theme={null}
    -- Если таблица BigQuery содержит столбец типа STRUCT, необходимо включить этот параметр,
    -- чтобы сопоставить его со столбцом ClickHouse типа Nested
    SET input_format_parquet_import_nested = 1;

    CREATE TABLE default.mytable
    (
            `timestamp` DateTime64(6),
            `some_text` String
    )
    ENGINE = MergeTree
    ORDER BY (timestamp);
    ```

    После создания таблицы включите настройку `parallel_distributed_insert_select`, если в вашем кластере несколько реплик ClickHouse, чтобы ускорить экспорт. Если у вас только один узел ClickHouse, этот шаг можно пропустить:

    ```sql theme={null}
    SET parallel_distributed_insert_select = 1;
    ```

    Наконец, мы можем вставить данные из GCS в нашу таблицу ClickHouse с помощью [команды `INSERT INTO SELECT`](/ru/reference/statements/insert-into#inserting-the-results-of-select), которая добавляет данные в таблицу на основе результатов запроса `SELECT`.

    Чтобы получить данные для `INSERT`, можно использовать [функцию s3Cluster](/ru/reference/functions/table-functions/s3Cluster) и загрузить данные из нашего GCS-бакета, поскольку GCS совместим с [Amazon S3](https://aws.amazon.com/s3/). Если у вас только один узел ClickHouse, вместо функции `s3Cluster` можно использовать [табличную функцию s3](/ru/reference/functions/table-functions/s3).

    ```sql theme={null}
    INSERT INTO mytable
    SELECT
        timestamp,
        ifNull(some_text, '') AS some_text
    FROM s3Cluster(
        'default',
        'https://storage.googleapis.com/mybucket/mytable/*.parquet.gz',
        '<ACCESS_ID>',
        '<SECRET>'
    );
    ```

    `ACCESS_ID` и `SECRET`, используемые в приведённом выше запросе, — это ваши [HMAC-ключи](https://cloud.google.com/storage/docs/authentication/hmackeys), связанные с вашим бакетом GCS.

    <Info>
      **Используйте `ifNull` при экспорте столбцов с типом Nullable**

      В приведённом выше запросе мы используем [функцию `ifNull`](/ru/reference/functions/regular-functions/functions-for-nulls#ifNull) со столбцом `some_text`, чтобы вставить данные в таблицу ClickHouse, подставляя значение по умолчанию. Вы также можете сделать столбцы в ClickHouse [`Nullable`](/ru/reference/data-types/nullable), но это не рекомендуется, так как это может негативно сказаться на производительности.

      В качестве альтернативы можно задать `SET input_format_null_as_default=1`, и любые отсутствующие значения или значения NULL будут заменяться значениями по умолчанию для соответствующих столбцов, если такие значения заданы.
    </Info>
  </Step>

  <Step>
    ## Проверка успешного экспорта данных

    Чтобы проверить, что данные были успешно вставлены, просто выполните запрос `SELECT` к новой таблице:

    ```sql theme={null}
    SELECT * FROM mytable LIMIT 10;
    ```

    Чтобы экспортировать другие таблицы BigQuery, просто повторите описанные выше шаги для каждой дополнительной таблицы.
  </Step>
</Steps>

<div id="further-reading-and-support">
  ## Дополнительные материалы и поддержка
</div>

В дополнение к этому руководству рекомендуем также прочитать нашу статью в блоге, где показано, [как использовать ClickHouse для ускорения BigQuery и как выполнять инкрементальный импорт](https://clickhouse.com/blog/clickhouse-bigquery-migrating-data-for-realtime-queries).

Если у вас возникли проблемы с переносом данных из BigQuery в ClickHouse, свяжитесь с нами по адресу [support@clickhouse.com](mailto:support@clickhouse.com).
