Лучшая практика для переноса данных из MySQL в BigQuery
Я попробовал несколько csv -F ormats (разные escape-символы, кавычки и другие настройки), чтобы экспортировать данные из MySQL и импортировать их в BigQuery, но я не смог найти решение, которое работает в каждом случае.
Google SQL требует следующий код для импорта/экспорта из/в MySQL. Хотя Cloud SQL не BigQuery, это хорошая отправная точка:
SELECT * INTO OUTFILE 'filename.csv' CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' FROM table
В настоящий момент я использую следующую команду для импорта сжатого csv в BigQuery: bq --nosync load -F "," --null_marker "NULL" --Format=csv PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json
С одной стороны, команда bq не позволяет установить escape-символ ("
экранируется другим "
, который, как представляется, является четко определенным CSV -F ormat). С другой стороны, \"
как escape-символ для MySQL-экспорта приведет к "N
как Null-value ", который тоже не работает:
CSV table references column position 34, but line starting at position:0 contains only 34 columns. (error code: invalid)
Поэтому мой вопрос: как написать (таблицу) независимую команду экспорта для MySQL в SQL, чтобы сгенерированный файл можно было загрузить в BigQuery. Какой escape-символ следует использовать и как обрабатывать/устанавливать нулевые значения?
Ответы
Ответ 1
Я работал с той же проблемой, здесь мое решение:
Экспорт данных из MySQL
Сначала экспортируйте данные из MySQL следующим образом:
SELECT * INTO OUTFILE 'filename.csv' CHARACTER SET 'utf8'
FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY ''
FROM table <yourtable>
В действительности это tsv файл (значения, разделенные вкладкой), но вы можете импортировать их как мысли csv.
Импорт в большой запрос
Таким образом, вы должны иметь возможность импортировать его в большой запрос со следующим
Параметры:
bq load --field_delimiter="\t" --null_marker="\N" --quote="" \
PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json
Примечания
-
Если какое-либо поле в вашей базе данных MySQL содержит символ табуляции (\t
), он разбивает ваши столбцы. Чтобы предотвратить добавление SQL-функции REPLACE(<column>, '\t', ' ')
в столбцы, она будет конвертировать из вкладок в пробелы.
-
Если вы установите схему таблицы в большом веб-интерфейсе запроса, вам не нужно будет указывать ее каждый раз при загрузке CSV.
Я надеюсь, что это сработает для вас.
Ответ 2
Использование следующей команды SQL, похоже, работает для меня, создавая нулевые значения с помощью \N
:
SELECT * INTO OUTFILE '/tmp/foo.csv' CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY "\\"
FROM table;
С этим вы должны иметь возможность импортировать данные с помощью --null_marker="\N"
. Можете ли вы дать попытку и сообщить мне, если она не работает для вас?
Ответ 3
ОБНОВЛЕНИЕ 2019:
Попробуйте это как альтернативу:
- Загрузите файлы резервных копий MySQL в экземпляр Cloud SQL.
- Читайте данные в BigQuery прямо из MySQL.
Более подробные инструкции:
Вы можете использовать такой инструмент, как mysql2xxxx для максимальной гибкости при экспорте.
С mysql2csv
вы можете выполнить произвольный запрос, и процесс вывода использует FasterCSV
, который предоставит вам больше возможностей, чем стандартные MySQL.
Ответ 4
У меня была та же самая проблема, импортировавшая из MySQL в Big Query, и поскольку мой набор данных содержит несколько текстовых столбцов, я не мог использовать стандартный разделитель вроде:; или даже \t без приложения.
Но с помощью приложения-оболочки у меня была либо проблема с двойной кавычкой с дефолтом \escaper, либо проблема с нулевым значением с "escaper", которая стала "N вместо \N".
Я смог заставить его работать, выполнив следующие шаги и конфигурацию. Хитрость заключается в использовании контрольного символа в качестве безопасного разделителя, поскольку я уверен, что в моих данных нет такого символа.
Шаг 1: экспорт из MySQL
Конфигурация:
- Полевой разделитель: управляющий символ 001
- Encloser: '' (none)
Вот полный запрос MySQL. Я использую AWS RDS Aurora, поэтому синтаксис немного отличается от стандартного MySQL (файл записывается на S3):
SELECT * FROM my_table
INTO OUTFILE S3 's3://xxxxx/tmp/my_table/data'
CHARACTER SET UTF8MB4
FIELDS TERMINATED BY x'01'
OPTIONALLY ENCLOSED BY ''
MANIFEST OFF
OVERWRITE ON
Шаг 2. Скопируйте набор данных в облачное хранилище с помощью gsutil
gsutil rsync -m s3://xxxxx/tmp/my_table/ gs://xxxxx/tmp/my_table/
Шаг 3: Загрузка данных в Big Query с использованием CLI
bq load --source_format=CSV --field_delimiter=^A --null_marker="\N" --quote="" project:base.my_table gs://xxxxx/tmp/my_table/* ./schema.json
Заметки
- ^ A - представление управляющего символа. Вы можете создать его в Windows, набрав Alt + 001, на linux-оболочке с Ctrl + V и Ctrl + A (более подробная информация здесь). На самом деле это всего лишь один персонаж.
- Мы не можем использовать веб-интерфейс для создания таблицы, так как мы не можем определить управляющий символ как разделитель.
Ответ 5
Таблица MySQL в BigQuery Import Script.md экспортирует таблицу MySQL или полную схему в Big Query.
mysql_table_to_big_query.sh экспортирует таблицу из MySQL в CSV и экспортирует схему в файл JSON и SQL. Затем файлы загружаются в папку облачного хранилища. Эти файлы затем импортируются в большой запрос. Набор данных BigQuery создается в том же проекте (если он не существует) с именем {SCHEMA_NAME} _ {DATE}.
Если в таблице есть столбец с типом данных DATE, то таблица разбивается на части в BigQuery.
mysql_schema_to_big_query.sh извлекает список всех таблиц из схемы MySQL и вызывает mysql_table_to_big_query.sh для каждой.
Сценарий создает CSV файлы, переводя нулевые значения по мере необходимости. Затем он передает их в существующее хранилище Google и импортирует их в большой запрос.
Ответ 6
Вы можете скопировать базу данных MySQL в Google BigQuery с помощью сторонних инструментов. Взгляните на страницу партнеров Google BigQuery: https://cloud.google.com/bigquery/partners/
Ответ 7
Вы можете попробовать sqldump-to. Он считывает любой поток, совместимый с MySQL, и выводит JSON с разделителем новой строки для простого импорта в BigQuery.
Проблема с CSV или TSV - это экранирующие символы. У JSON такой проблемы нет.
Инструмент также поддерживает экспорт схемы, который впоследствии необходимо будет редактировать с конкретными типами данных BigQuery для каждого столбца, но это полезный старт.
Например, используйте mysqldump
для потоковой передачи в sqldump-to
:
mysqldump -u user -psecret dbname | sqldump-to --dir-output ./dbname --schema
Вам может потребоваться изменить команду mysqldump, чтобы она соответствовала вашей конкретной конфигурации MySQL (например, удаленные серверы и т.д.)
Если у вас уже есть файл дампа, инструмент также поддерживает несколько рабочих, чтобы лучше использовать ваш ЦП.
Как только sqldump-to
создаст ваши файлы JSON, просто используйте инструмент командной строки bq
для загрузки в BigQuery:
bq load --source_format=NEWLINE_DELIMITED_JSON datasetname.tablename tablename.json tablename_schema.json