Облачный поток данных Google (текстовые файлы в облачный ключ) java.lang.RuntimeException: ошибка при синтаксическом анализе. строка: CSVRecord

#google-cloud-platform #google-cloud-dataflow

#google-cloud-platform #google-cloud-dataflow

Вопрос:

Я запускаю задание облачного потока данных для импорта нескольких текстовых файлов (.csv) из GCS в cloud spanner.

Задание частично выполняется, импортируется около 6 миллионов из 1 миллиарда строк, но затем задание завершается ошибкой из-за этой ошибки:

 Error message from worker: java.lang.RuntimeException: org.apache.beam.sdk.util.UserCodeException: java.lang.RuntimeException: Error to parseRow. row: CSVRecord [comment='null', recordNumber=1, values=[source_set_id_hash, rank, run_id, source_set_id, recommended_set_id, score, updated_at, version]], table: CREATE TABLE `set_recs_similar_content` (
    `source_set_id_hash`                    STRING(MAX) NOT NULL,
    `version`                               STRING(MAX) NOT NULL,
    `rank`                                  INT64 NOT NULL,
    `recommended_set_id`                    INT64 NOT NULL,
    `run_id`                                STRING(MAX) NOT NULL,
    `score`                                 FLOAT64 NOT NULL,
    `source_set_id`                         INT64 NOT NULL,
    `updated_at`                            TIMESTAMP NOT NULL,
) PRIMARY KEY (`source_set_id_hash` ASC, `version` ASC, `rank` ASC)

 

Это потому, что он считывает первую строку CSV и ожидает, что она будет соответствовать формату?

Соответствующий раздел из моего файла manifest.json приведен ниже:

       "columns": [
        {"column_name": "source_set_id_hash", "type_name": "STRING"},
        {"column_name": "rank", "type_name": "INT64"},
        {"column_name": "run_id", "type_name": "STRING"},
        {"column_name": "source_set_id", "type_name": "INT64"},
        {"column_name": "recommended_set_id", "type_name": "INT64"},
        {"column_name": "score", "type_name": "FLOAT64"},
        {"column_name": "updated_at", "type_name": "TIMESTAMP"},
        {"column_name": "version", "type_name": "STRING"}
      ]
 

Все файлы в GCS отформатированы одинаково, поэтому кажется странным, что 6% задания будет выполнено, но затем завершится неудачей.

Соответствующая ссылка на документацию: https://cloud.google.com/dataflow/docs/guides/templates/provided-batch#gcstexttocloudspanner

Спасибо

Комментарии:

1. Часть сообщения об ошибке «значения» обычно содержит значения, а не такие имена столбцов, как values=[source_set_id_hash, rank , поэтому я думаю, что ваша гипотеза верна. Указаны ли имена столбцов в ваших файлах?

Ответ №1:

Оказывается, заголовок не должен присутствовать в ваших CSV-файлах.

Из исходного файла шаблона:

  * <p>Text file must NOT have a header.
 

Пожалуйста, повторите попытку после удаления заголовка из всех ваших файлов. Строка ниже из сообщения об ошибке предполагает, что первая строка была заголовком:

recordNumber=1, values=[source_set_id_hash, rank, run_id, source_set_id, recommended_set_id, score, updated_at, version]

Комментарии:

1. Спасибо, Питер, это сработало. Я не знал, является ли массив значений списком фактических значений или ссылками на столбцы. Пример файла manifest.json, приведенный в документах, также заставил меня думать, что заголовки столбцов имеют некоторую полезность.