У меня есть множество очень больших (~ 4 ГБ каждый) CSV-файлов, которые содержат разные форматы.Они поступают от регистраторов данных более 10 различных производителей.Я пытаюсь объединить все это в BigQuery.Чтобы загружать их ежедневно, я хочу сначала загрузить эти файлы в облачное хранилище, определить схему, а затем загрузить в BigQuery.В связи с тем, что некоторые файлы содержат дополнительную информацию заголовка (от 2 до 30 строк), я создал свои собственные функции для определения наиболее вероятной строки заголовка и схемы из выборки каждого файла (~ 100 строк), котораяЗатем я могу использовать в job_config при загрузке файлов в BQ.
Это прекрасно работает, когда я работаю с файлами из локального хранилища напрямую в BQ, поскольку я могу использовать менеджер контекста и затем модуль Python csv, в частностиСниффер и ридер объектов.Однако, похоже, не существует эквивалентного метода использования диспетчера контекста непосредственно из хранилища.Я не хочу обходить Cloud Storage в случае, если какой-либо из этих файлов будет прерван при загрузке в BQ.
Что я могу заставить работать:
# initialise variables
with open(csv_file, newline = '', encoding=encoding) as datafile:
dialect = csv.Sniffer().sniff(datafile.read(chunk_size))
reader = csv.reader(datafile, dialect)
sample_rows = []
row_num = 0
for row in reader:
sample_rows.append(row)
row_num+=1
if (row_num >100):
break
sample_rows
# Carry out schema and header investigation...
С Google Cloud Storage я попыталсяиспользовать download_as_string и download_to_file, которые предоставляют двоичные представления объектов данных, но тогда я не могу заставить модуль csv работать с любыми данными.Я попытался использовать .decode ('utf-8'), и он возвращает длинную строку с \ r \ n.Затем я использовал splitlines (), чтобы получить список данных, но функции csv по-прежнему предоставляют диалект и читатель, который разбивает данные на отдельные символы при каждой записи.
Кто-нибудь успел обойти эту проблему?использовать модуль csv с файлами, хранящимися в облачном хранилище, не загружая весь файл?