У меня есть очень большой файл CSV (скажем, 1 ТБ), который мне нужно получить из GCS на BQ. Хотя в BQ есть CSV-загрузчик, имеющиеся у меня CSV файлы довольно нестандартны и не загружаются должным образом в BQ без его форматирования.
Обычно я загружал файл csv на сервер, чтобы "обработать" его, и сохранял его либо непосредственно в BQ, либо в файле avro, который BQ может легко усвоить. Тем не менее, файл довольно большой, и вполне возможно (и, вероятно), что у меня не было бы хранилища/памяти для пакетной обработки без написания большого количества кода для его оптимизации/потоковой передачи.
Это хороший пример использования Cloud Dataflow? Есть ли уроки, как получить файл формата "X" из GCS в BQ? Любые учебные указатели или примеры скриптов для этого были бы хороши.
Я бы лично использовал Dataflow (не Dataprep) и писал простой конвейер для параллельного чтения файла, его очистки/преобразования и, наконец, записи в BigQuery. Это довольно просто. Вот пример одного из них в моем репозитории GitHub. Хотя это в Java, вы можете легко перенести его на Python. Примечание: он использует функцию "шаблоны" в потоке данных, но это можно изменить с помощью одной строки кода.
Если Dataflow находится вне таблицы, другим вариантом может быть использование странного/неиспользуемого разделителя и чтение всей строки в BigQuery. Затем используйте SQL/Regex/UDF для очистки/преобразования/анализа. Смотрите здесь (предложение от Фелипе). Мы делали это много раз в прошлом, и потому что вы в BigQuery, он очень хорошо масштабируется.
\n
. Я видел терминаторы полей, такие как \x02
, и поэтому одна запись будет занимать две (или более) строки. Есть ли возможный способ исправить это с помощью подхода BQ?
Я хотел бы рассмотреть возможность использования Cloud Dataprep.
Dataprep может импортировать данные из GCS, очищать/изменять данные и экспортировать в BigQuery. Одна из функций, которая мне нравится, заключается в том, что все можно сделать визуально/интерактивно, чтобы я мог видеть, как данные преобразуются.
Начните с подмножества ваших данных, чтобы увидеть, какие преобразования необходимы, и дать себе некоторую практику перед загрузкой и обработкой ТБ данных.
Вы всегда можете перенести из хранилища непосредственно в таблицу BQ:
bq --location=US load --[no]replace --source_format=CSV dataset.table gs://bucket/file.csv [schema]
Здесь [schema]
может быть встроенной схемой вашего CSV файла (например, id:int,name:string,..
) или путем к файлу схемы JSON (доступно локально).
Согласно документации BQ, они пытаются распараллелить большие CSV-нагрузки в таблицы. Конечно, существует верхняя граница: максимальный размер несжатого (CSV) файла, который будет загружен из GCS в BQ, должен быть <= 5 ТБ, что намного выше ваших требований. Я думаю, тебе должно быть хорошо с этим.
\x01
, может не начинаться с первой строки, может содержать символы комментария и т. Д. Учитывая это требование, как бы вы предложили это сделать тогда?