Вопрос или проблема
Изменение имени столбца в Google BigQuery во время загрузки
Я загружаю данные JSON в BigQuery. JSON содержит различные структуры, которые в свою очередь содержат ряд полей STRING. Я могу разобрать 99% того, что мне нужно, но застрял с одной из оставшихся колонок. Причина в том, что название колонки содержит и пробел, и дефис. Оба варианта недопустимы в BigQuery (до тех пор, пока гибкая поддержка именования колонок не выйдет на общий доступ).
Я загружаю данные в SQL с использованием такого подхода:
CREATE OR REPLACE EXTERNAL TABLE <proj>.<dataset>.<tablename> {
teams_remove STRUCT<team_a STRING, team_b STRING, winning team STRING, losing-manager STRING>
)
Это всего лишь пример, чтобы показать синтаксис, с которым я работаю. В этом примере третья строка ‘winning team’ не сможет быть разобрана/загружена из-за пробела, а четвертая не загрузится из-за дефиса.
Существует ли способ переименовать колонку/поле во время загрузки?
К сожалению, я не могу предварительно обработать исходные данные, чтобы исправить названия колонок.
Спасибо!
Ответ или решение
К сожалению, в Google BigQuery нет прямого способа переименовать столбцы в структуре во время загрузки данных, если источником данных являются JSON файлы с неподходящими именами полей. Однако, вы можете использовать альтернативные методы, чтобы обойти это ограничение.
- Обработка с использованием SQL: Вы можете загрузить данные в промежуточную таблицу с помощью стандартных имен и сделать выборку из этой таблицы, переименовывая столбцы при использовании SQL. Например:
CREATE OR REPLACE TABLE `<proj>.<dataset>.<intermediate_table>`
AS
SELECT
teams_remove.team_a,
teams_remove.team_b,
teams_remove.`winning team` AS winning_team,
teams_remove.`losing-manager` AS losing_manager
FROM
`<proj>.<dataset>.<external_table>`;
В этом запросе мы используем обратные кавычки, чтобы указать имена столбцов с пробелами или дефисами. Вы можете переименовать их на лету во время выборки данных из промежуточной таблицы.
- Использование внешних таблиц: Если вы не можете изменить источник данных, вы можете создать внешнюю таблицу, используя
CREATE EXTERNAL TABLE
и затем выполнять выборку с переименованием столбцов.
Пример создания внешней таблицы:
CREATE OR REPLACE EXTERNAL TABLE `<proj>.<dataset>.<external_table>`
OPTIONS (
format = 'JSON',
uris = ['gs://path_to_your_file/*.json']
);
Затем вы можете обратиться к этой внешней таблице и переименовать столбцы в запросе, как показано выше.
-
BigQuery Dataflow: Если у вас есть доступ к Google Cloud Dataflow, вы можете создать потоки обработки данных, которые могут помочь вам изменить имена полей при загрузке. Это может быть более сложный и занятный процесс, но он позволяет более гибко управлять данными перед загрузкой в BigQuery.
- Объединение с Python или другой языковой средой: Вы также можете использовать Python и библиотеку google-cloud-bigquery для загрузки данных, где вы можете обработать JSON и изменить имена колонок перед загрузкой.
В заключение, если напрямую переименовать столбцы в процессе загрузки невозможно, вы можете использовать промежуточные таблицы или другие средства обработки данных, чтобы обойти ограничение BigQuery и корректно загрузить ваши данные.