BigQuery Load CSV / TSV, который содержит экранированную вкладку - PullRequest
0 голосов
/ 26 апреля 2020

РЕДАКТИРОВАНИЕ: Предоставление дополнительных образцов данных, а также используемой схемы.

У меня проблемы с загрузкой файлов с разделителями табуляции (*.tsv) в BigQuery через CLI.

Две строки образцов данных (test.tsv) ниже. Ссылка на пример данных ЗДЕСЬ

user    2019-04-30 11:12:42 3459323 6461614 945923  683716374614    14362   30475264    9919323 15502   144353  14115   57  1.11.11.11      0   1   23  75  aerfla/8.0 (aerf; aerf aerf aa 22_2 like str aef X) aerfae/65.91.15 (aea like fae) aerf/a1548 (556544)  xxxx    x   xxx 77023   992015  file:///path/path   Product     file:///path/path   Product Detail      file:///path/path   3   file:///path/path   3       Product Detail                          xx:Pe Matten - Kids'                227,288,289,101,114,135,147,153
user    2019-04-30 11:12:31 89459323    41661614    8056994 5481614 54351   60815513    59169523273 96602   44350   1556644115  57  1.11.11.11      0   1   67  35  adf/6.1 (aerfae; ae aerf 1S 12_3 like eec ee x) aerfapaerfb/615.0.5 (aerfL, like aao) aerfe/1E18 (6544) xxxxxxld    xxx xxx 770 84015   file:///path/path/  LLL: aerfa      file:///path/path/path/path/            file:///path/path/path/ 3   file:///path/path   3       Search Results                                              
user    2019-04-30 11:12:32 071459323   753717461   805659323   7461614 4452    68296384    76953768    6602    1351    1556644115  57  1.11.11.11      0   1   76  5   aerfa/9.0 (aerfae; xxx aerfa xx 19_0 like xaerf xx X) aerfaerf/605.1.15 (aerfaerf, like aerfaerf) aerfaerf/1aerf5E148 (52995544)    xxxxxx  xx  xxxx    770 84015   file:///path/path/  Product     file:///path/path   Product Detail      file:///path/path/  3   file:///path/path/  3       PPP Detail                          DDD:AAA Glove\  - Kids'             227,288,289,211,114,135,147,153 

Файл test_schema.json:

[
    {"name":"col0", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col1", "type": "TIMESTAMP", "mode": "NULLABLE"},
    {"name":"col2", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col3", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col4", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col5", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col6", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col7", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col8", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col9", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col10", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col11", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col12", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col13", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col14", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col15", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col16", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col17", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col18", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col19", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col20", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col21", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col22", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col23", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col24", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col25", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col26", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col27", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col28", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col29", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col30", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col31", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col32", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col33", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col34", "type": "INTEGER", "mode": "NULLABLE"},
    {"name":"col35", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col36", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col37", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col38", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col39", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col40", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col41", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col42", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col43", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col44", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col45", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col46", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col47", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col48", "type": "STRING", "mode": "NULLABLE"},
    {"name":"col49", "type": "STRING", "mode": "NULLABLE"}
]

Команда CLI BQ, которая работает без ошибок:

bq load \
--field_delimiter=tab \
--source_format=CSV \
--allow_jagged_rows \
--replace \
mydataset.test \
test.tsv \
test_schema.json

Команда не будет работать без опции --allow_jagged_rows. Использование max_bad_records=100 или --ignore_unknown_values тоже не помогло. Я получаю сообщение об ошибке, если не использую --allow_jagged_rows:

Error while reading data, error message: CSV table references
column position 49, but line starting at position:0 contains only
49 columns.

При использовании --allow_jagged_rows для загрузки данных в BQ существует проблема с анализом значения в col43. Снимок экрана второй половины таблицы BQ после загрузки с использованием интерфейса командной строки: enter image description here

Для предоставленных образцов данных проблемы возникают в столбце col43. Первый ряд и третий ряд были проанализированы правильно. Во второй строке показано, что BQ разбивает значение DDD:AAA Glove\ - Kids' на два и заполняет оба значения col43 и col44 вместо col43. Кроме того, это влияет на количество столбцов после него. Ясно, что синтаксический анализатор BQ не подтверждает, что символу tab предшествует \ в DDD:AAA Glove\ - Kids'.

Есть ли способ избежать tab, которому предшествует \ ? Большинство примеров, которые я видел относительно escape-символов при загрузке CSV в BQ, имеют отношение к экранирующим кавычкам. Я не нашел ничего полезного для моей проблемы. Я также пытаюсь избежать изменения этих файлов с помощью поиска / замены.

Если не удается избежать этого \\t, я задаюсь вопросом, может ли моя единственная надежда - читать в каждой строке одну строку в промежуточная таблица BQ, затем выполните окончательный анализ в BQ с SQL, где я мог бы иметь больше контроля.

...