большая проблема с загрузкой csv запроса

Недавно я начал работать над gcp и bigquery в целом. Я получаю следующую ошибку при загрузке файла csv из облачного хранилища Google в таблицу BQ с помощью облачного композитора Google.

Ниже приведен код, который я использую.

t1 = GoogleCloudStorageToBigQueryOperator(
      task_id='gcs_to_bq_mak',
      bucket='bucketname',
      source_objects=['FULL/mak.csv'],
      field_delimiter='|',
      destination_project_dataset_table='{0}.mak_initial_f'
      .format(BQ_DATASET_NAME),
      schema_fields= mak_schemas.mak_schema(),
      #create_disposition='CREATE_IF_NEEDED',
      skip_leading_rows=1,
      #quote = '""',
      #quote = ''
      #quote = '"'
      #allowQuotedNewlines =  True,
      write_disposition='WRITE_APPEND',
      time_partitioning={'Date':'timestamp'}
                 )

Мой файл разделен трубой.

Независимо от того, какое значение я установил для своего оператора кавычек, все, что я получаю, это ошибка ниже

Ошибка: данные между закрывающей двойной кавычкой ("") и разделителем полей. '}], 'состояние': 'ГОТОВО'}}

Я не уверен, что использую опцию цитаты по назначению.

Ниже приведен пример строки, почему моя работа не выполняется.

100|I|50|100010012|F|1" ПАЭ|1-8" ПАЭ|20190|C|1

как вы видите, " был закрыт после разделителя, который является каналом, поэтому моя работа не удалась.

Есть ли какой-либо обходной путь для этого? Я ссылался на многие сообщения, все упоминали об использовании оператора кавычек, но это не работает для меня или я не использую его должным образом.

Теперь, если невозможно избежать кавычек в поле, я планирую загрузить всю строку в виде текста в таблицу int.

но каким должен быть мой следующий шаг, как снова загрузить эту единственную строку обратно в исходную таблицу.

пример кода, который я планирую реализовать.

t3 = GoogleCloudStorageToBigQueryOperator(
        task_id='mak_load_one_column',
        bucket='bucketname',
        source_objects=['mak.csv'],
        field_delimiter='\t',
        allow_jagged_rows=True,
        destination_project_dataset_table='{0}.mak_init_singlecolumn'
        .format(BQ_DATASET_NAME),
        schema_fields=[{"name": "singlecolumn","type": "TEXT","description": 
                      "load all the rows into one column"}],
        skip_leading_rows=1,
        write_disposition='WRITE_APPEND',
        #time_partitioning={'Date':'timestamp'},
        #provide_context=True,
        #trigger_rule=TriggerRule.ALL_FAILED)

но как перезагрузить данные в таблицу с правильной схемой.

Любые советы приветствуются.

С уважением.


person kumarm    schedule 27.08.2019    source источник


Ответы (3)


RFC 4180

2.5 Каждое поле может быть заключено или не заключено в двойные кавычки... Если поля не заключены в двойные кавычки, то двойные кавычки могут не появляться внутри полей.

2.6 Поля, содержащие разрывы строк (CRLF), двойные кавычки и запятые, должны быть заключены в двойные кавычки.

2.7 Если для заключения полей используются двойные кавычки, то двойные кавычки, появляющиеся внутри поля, должны быть экранированы путем постановки перед ними другой двойной кавычки. Например:

"ааа", "б", "бб", "ссс"

Не все полностью совместимо с csv. С другими разделителями все в порядке, и правила цитирования могут различаться, поэтому между двумя библиотеками, которые пытаются здесь общаться друг с другом, может быть проблема, связанная с библиотекой. Но поскольку вы упомянули о попытке процитировать его, я бы предложил попробовать этот формат (хотя я бы просто заключил каждое поле в двойные кавычки)

100|I|50|100010012|F|"1"""ПАЭ"|"1-8"""ПАЭ"|20190|C|1

или если и та труба должна быть в поле тоже, может вы это имели в виду?

100|I|50|100010012|F|"1"" ПАЭ|1-8"" ПАЭ"|20190|C|1

person Kenny Ostrom    schedule 27.08.2019
comment
Привет, спасибо за ответ. Да, вы правы, каждая двойная кавычка должна заканчиваться предшествующей двойной кавычкой, но моя проблема заключается в двойных кавычках моих данных после того, как число имеет значение. Более того, у меня более 100 миллионов записей, поэтому редактирование вручную или с помощью скрипта невозможно. Есть ли способ игнорировать его при загрузке файла в таблицу. - person kumarm; 27.08.2019
comment
Вы можете поиграть с параметром quote_character, но вам, возможно, придется переписать все файлы (скрипт). Алгоритмически это не меняет вашего большого О. Возможно, вы сможете вставить этот скрипт конвертера в качестве промежуточного шага в воздушный поток как PythonOperator. (Я мало что знаю о воздушном потоке, кроме беглого просмотра документации.) - person Kenny Ostrom; 27.08.2019

Для любого любопытного я загрузил всю запись как большой двоичный объект в таблицу int, проанализировал и загрузил целевую таблицу из таблицы int. избежать двойных кавычек на данный момент кажется невозможным.

person kumarm    schedule 28.08.2019

У нас была такая же проблема, и она решается следующим образом:

quote_character=""

Интересно, что это не было решено, когда мы сделали #quote_character или quote_character=None \o/

person Antonio Alves    schedule 28.07.2020