Загрузка AVRO из Bucket через CLI в BigQuery с разделом Date - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь импортировать данные в BigQuery через AVRO с разделом Date. При импорте через cli ошибка, связанная с секционированной датой, должна быть датой или отметкой времени, но она получает целое число.

С учетом файла AVRO, аналогичного приведенному ниже:

{
  "namespace": "test_namespace",
  "name": "test_name",
  "type": "record",
  "fields": [
    { 
      "name": "partition_date",
      "type": "int",
      "logicalType": "date"
    },
    {
      "name": "unique_id",
      "type": "string"
    },
    {
      "name": "value",
      "type": "double"
    }
}

Затем я использую следующие команды через интерфейс командной строки, чтобы попытаться создать новую таблицу

bg load \
--replace \
--source_format=AVRO \
--use_avro_logical_types=True \
--time_partitioning_field partition_date \
--clustering_fields unique_id \
mydataset.mytable \
gs://mybucket/mydata.avro

Ожидается, что новая таблица будет разбита на столбец «Дата» «partition_date», а затем сгруппирована по « unique_id ".

Редактировать: Пожалуйста, смотрите ошибку ниже

The field specified for the time partition can only be of type TIMESTAMP or DATE. The type found is: INTEGER.

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

bq load --replace --source_format=AVRO --use_avro_logical_types=True --time_partitioning_field "partition_date" --clustering_fields "unique_id" BQ_DATASET BUCKET_URI

Это схема AVRO, которая Я использую

{
    "namespace": "example.avro",
    "type": "record",
    "name": "Test",
    "fields": [
        { "name": "partition_date", "type": "int", "logicalType": "date" },
        { "name": "unique_id", "type": "string"},
        { "name": "value", "type": "float" }
   ]
}

Стоит отметить, что это старый проект Google (примерно 2-3 года), если это имеет какое-либо отношение.

Я также на windows 10 с последним Google SDK.

1 Ответ

0 голосов
/ 22 апреля 2020

Я не получил ни одного сообщения об ошибке при выполнении той же операции загрузки, генерации равной схемы данных AVRO и использовании желаемой структуры таблицы приемников Bigdata.

Согласно документации GCP вы используется --use_avro_logical_types=True флаг вдоль bq командной строки, правильно распространяемой преобразование типов данных, сохраняя DATA логический тип Avro для преобразования в эквивалентный Дата тип в Bigquery.

Вы можете сослаться на мою схему таблиц Bigquery, проверяя структуру таблицы на вашей стороне, так как вы не предоставили структуру таблицы и само сообщение об ошибке, я пока не могу предложить больше:

$ bq show --project_id=<Project_ID>  <Dataset>.<Table>
Table <Project_ID>:<Dataset>.<Table>

   Last modified            Schema            Total Rows   Total Bytes   Expiration        Time Partitioning        Clustered Fields   Labels
 ----------------- ------------------------- ------------ ------------- ------------ ----------------------------- ------------------ --------
  22 Apr 12:03:57   |- partition_date: date   3            66                         DAY (field: partition_date)   unique_id
                    |- unique_id: string
                    |- value: float

I Использовали тип FLOAT для value для простого преобразования типа данных AVRO DOUBLE в соответствии с рекомендациями здесь .

bq Версия CLI:

$ bq version
This is BigQuery CLI 2.0.56

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

ОБНОВЛЕНИЕ:

Я проверил предоставленную информацию, но я все еще путаюсь с ошибкой, которую вы получаете. Видимо, я вижу, что в вашем случае флаг use_avro_logical_types=True не выполняет преобразование логического типа. Однако я нашел эту функцию PIT request , где люди просят «внести в белый список» свои проекты, чтобы позволить себе функциональность логического типа AVRO, то есть этот комментарий . Поскольку эта функция была развернута в глобальном сообществе, это может быть упущением, что некоторые проекты GCP не могут ее использовать.

...