Получить массивный CSV-файл из GCS в BQ

1

У меня есть очень большой файл CSV (скажем, 1 ТБ), который мне нужно получить из GCS на BQ. Хотя в BQ есть CSV-загрузчик, имеющиеся у меня CSV файлы довольно нестандартны и не загружаются должным образом в BQ без его форматирования.

Обычно я загружал файл csv на сервер, чтобы "обработать" его, и сохранял его либо непосредственно в BQ, либо в файле avro, который BQ может легко усвоить. Тем не менее, файл довольно большой, и вполне возможно (и, вероятно), что у меня не было бы хранилища/памяти для пакетной обработки без написания большого количества кода для его оптимизации/потоковой передачи.

Это хороший пример использования Cloud Dataflow? Есть ли уроки, как получить файл формата "X" из GCS в BQ? Любые учебные указатели или примеры скриптов для этого были бы хороши.

  • 0
    Dataflow может сделать это с помощью Python или Java, а Dataprep может сделать это за вас.
  • 0
    @Pablo, есть ли примеры ссылок, которые бы показали, как что-то подобное можно сделать с помощью Dataflow?
Теги:
csv
google-cloud-storage
google-bigquery
google-cloud-dataflow

3 ответа

2
Лучший ответ

Я бы лично использовал Dataflow (не Dataprep) и писал простой конвейер для параллельного чтения файла, его очистки/преобразования и, наконец, записи в BigQuery. Это довольно просто. Вот пример одного из них в моем репозитории GitHub. Хотя это в Java, вы можете легко перенести его на Python. Примечание: он использует функцию "шаблоны" в потоке данных, но это можно изменить с помощью одной строки кода.

Если Dataflow находится вне таблицы, другим вариантом может быть использование странного/неиспользуемого разделителя и чтение всей строки в BigQuery. Затем используйте SQL/Regex/UDF для очистки/преобразования/анализа. Смотрите здесь (предложение от Фелипе). Мы делали это много раз в прошлом, и потому что вы в BigQuery, он очень хорошо масштабируется.

  • 0
    Очень интересный подход к вышесказанному с использованием странного разделителя. Я использовал это иногда в пандах, чтобы собрать все данные в один столбец. Однако при использовании этого подхода мы сталкиваемся с одной особенностью: строки иногда не имеют разделителя \n . Я видел терминаторы полей, такие как \x02 , и поэтому одна запись будет занимать две (или более) строки. Есть ли возможный способ исправить это с помощью подхода BQ?
2

Я хотел бы рассмотреть возможность использования Cloud Dataprep.

Dataprep может импортировать данные из GCS, очищать/изменять данные и экспортировать в BigQuery. Одна из функций, которая мне нравится, заключается в том, что все можно сделать визуально/интерактивно, чтобы я мог видеть, как данные преобразуются.

Начните с подмножества ваших данных, чтобы увидеть, какие преобразования необходимы, и дать себе некоторую практику перед загрузкой и обработкой ТБ данных.

  • 0
    спасибо за предложение. Какая разница между использованием Dataflow и Dataprep? Будет ли работать для работы, или облачный поток данных не будет вариант для выше?
  • 1
    Dataflow использует программное обеспечение (обычно Python), а Dataprep использует визуальную панель мониторинга. Оба будут делать то, что вы хотите, просто разные техники.
Показать ещё 5 комментариев
0

Вы всегда можете перенести из хранилища непосредственно в таблицу 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 ТБ, что намного выше ваших требований. Я думаю, тебе должно быть хорошо с этим.

  • 0
    в теории это работает хорошо. Однако на практике файлы обычно не "BQ-ready". Например, разделитель (поля) в файле может быть нестандартным разделителем, таким как \x01 , может не начинаться с первой строки, может содержать символы комментария и т. Д. Учитывая это требование, как бы вы предложили это сделать тогда?
  • 0
    по этой ссылке прямо здесь - cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv - мы столкнемся с четырьмя из их четырех ограничений, и наша кодировка csv (раздел ограничителей) также не будет работать для БК. Другими словами, нам нужно «предварительно обработать» файл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню