Лучшая практика для переноса данных из 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