Как я могу исправить запрос на обновление для этой схемы таблицы BigQuery?

# #google-bigquery

Вопрос:

У меня есть следующая структура данных:

 [
   {
      "mode": "NULLABLE",
      "name": "id",
      "type": "STRING"
   },
   {
    "fields": [
      {
        "mode": "NULLABLE",
        "name": "key",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "lifeid",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "monthly",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "thingtype",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "thingvalue",
        "type": "INTEGER"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "premium",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "provider",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "rank",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "provider",
        "type": "RECORD"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "someBool",
            "type": "BOOLEAN"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "code",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "description",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "listName",
                "type": "STRING"
              }
            ],
            "mode": "NULLABLE",
            "name": "anotherBool",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "caseid",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "dateCreated",
                "type": "TIMESTAMP"
              },
              {
                "mode": "NULLABLE",
                "name": "dateLastModified",
                "type": "TIMESTAMP"
              },
              {
                "mode": "NULLABLE",
                "name": "interviewTerminated",
                "type": "BOOLEAN"
              },
              {
                "mode": "NULLABLE",
                "name": "status",
                "type": "STRING"
              }
            ],
            "mode": "NULLABLE",
            "name": "casedata",
            "type": "RECORD"
          },
          {
            "mode": "NULLABLE",
            "name": "hasAttachments",
            "type": "BOOLEAN"
          },
          {
            "mode": "NULLABLE",
            "name": "hasX",
            "type": "BOOLEAN"
          },
          {
            "mode": "NULLABLE",
            "name": "lifeId",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "lifeIdentifier",
            "type": "STRING"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "code",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "description",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "listName",
                "type": "STRING"
              }
            ],
            "mode": "NULLABLE",
            "name": "status",
            "type": "RECORD"
          },
          {
            "mode": "NULLABLE",
            "name": "mibComplete",
            "type": "BOOLEAN"
          },
          {
            "mode": "NULLABLE",
            "name": "thingid",
            "type": "STRING"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "code",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "description",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "listname",
                "type": "STRING"
              }
            ],
            "mode": "REPEATED",
            "name": "riskTypes",
            "type": "RECORD"
          }
        ],
        "mode": "NULLABLE",
        "name": "randomcompany",
        "type": "RECORD"
      },
      {
        "mode": "NULLABLE",
        "name": "termlength",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "timestamp",
        "type": "TIMESTAMP"
      }
    ],
    "mode": "REPEATED",
    "name": "things",
    "type": "RECORD"
  },
]
 

Я пытаюсь обновить things для данного id использования:

 UPDATE `table` SET things = things ||  [
        struct<key STRING, lifeid STRING, monthly STRING, thingtype STRING, thingvalue INTEGER, 
            provider struct<premium STRING, provider STRING, rank STRING>, 
            randomcompany struct< 
                someBool BOOLEAN,
                anotherBool struct<code STRING, description STRING, listName STRING>,
                casedata struct<caseid STRING, dateCreated STRING, dateLastModified STRING, interviewTerminated BOOLEAN, status STRING>,
                hasAttachments BOOLEAN,
                hasX BOOLEAN,
                lifeId STRING,
                lifeIdentifier STRING,
                status struct<code STRING, description STRING, listName STRING>,
                mibComplete BOOLEAN,
                thingid STRING,
                riskTypes array<struct<code STRING, description STRING, listName STRING>>
            >, 
            termlength STRING, timestamp TIMESTAMP>
        ('example key', 'example lifeid', 'example monthly', 'example thingtype', 4, 
            struct('example premium' as premium, 'example provider' as provider, 'example rank' as rank), 
                (true,
                    struct('a code' as code, 'a description' as description, 'a listName' as listname),
                    struct('6752' as caseid, NULL as dateCreated, NULL as dateLastModified, false as interviewTerminated, 'OPEN' as status),
                    false,
                    false,
                    'LV25APL37',
                    'LV25APL37',
                    struct('a code' as code, 'a description' as description, 'a listName' as listname),
                    false,
                    'ST11006752',
                    [struct('a code' as code, 'a description' as description, 'a listName' as listname)]
                ), 
                'example termlength', NULL
        )
    ]
WHERE id = '7PHh1dN0HdVGCAzIDIVkPWQ4GjI3';
 

Это не работает, и я получаю ошибку:

 No matching signature for operator || for argument types: ARRAY<STRUCT<key STRING, lifeid STRING, monthly STRING, ...>>, ARRAY<STRUCT<key STRING, lifeid STRING, monthly STRING, ...>>. Supported signatures: STRING || STRING; BYTES || BYTES; ARRAY || ARRAY at [1:77]
 

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

bq --format=prettyjson show -j project:US.bquxjob_...

Каков правильный синтаксис для обновления здесь, пожалуйста?

Кроме того, есть ли способ отладить подобные проблемы, например, увидеть полную ошибку.

При написании подобных утверждений, каково эмпирическое правило для псевдонимов и когда мне нужно явно писать struct( или [struct( во второй половине запроса? Наверняка первая половина дает всю информацию о типах?

Наконец, я упускаю суть здесь с BigQuery? Должен ли я разбить текущую структуру данных на разные таблицы? Конечно, структура не так сложна и должна быть легко обновляемой?!

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

1. вам нужно убедиться, что объединенные массивы имеют ОДИНАКОВУЮ схему! все имена, типы должны быть одинаковыми! в противном случае — именно эта ошибка возникает! В ваших предыдущих двух подобных вопросах, на которые я ответил, — это был именно тот способ, который разрешил ваши проблемы. вам нужно применить ту же технику здесь! Если все еще проблема и вам все еще понадобится помощь — вы должны предоставить своего рода инструкцию create table, которая будет воспроизводить ваши данные, чтобы мы могли с ней поиграть

Ответ №1:

просто быстрый снимок — попробуйте ниже (я заметил два места, где тип был СТРОКОВЫМ, но должен быть ОТМЕТКОЙ ВРЕМЕНИ)

 UPDATE `table` SET things = things ||  [
        struct<key STRING, lifeid STRING, monthly STRING, thingtype STRING, thingvalue INTEGER, 
            provider struct<premium STRING, provider STRING, rank STRING>, 
            randomcompany struct< 
                someBool BOOLEAN,
                anotherBool struct<code STRING, description STRING, listName STRING>,
                casedata struct<caseid STRING, dateCreated TIMESTAMP, dateLastModified TIMESTAMP, interviewTerminated BOOLEAN, status STRING>,
                hasAttachments BOOLEAN,
                hasX BOOLEAN,
                lifeId STRING,
                lifeIdentifier STRING,
                status struct<code STRING, description STRING, listName STRING>,
                mibComplete BOOLEAN,
                thingid STRING,
                riskTypes array<struct<code STRING, description STRING, listName STRING>>
            >, 
            termlength STRING, timestamp TIMESTAMP>
        ('example key', 'example lifeid', 'example monthly', 'example thingtype', 4, 
            struct('example premium' as premium, 'example provider' as provider, 'example rank' as rank), 
                (true,
                    struct('a code' as code, 'a description' as description, 'a listName' as listname),
                    struct('6752' as caseid, NULL as dateCreated, NULL as dateLastModified, false as interviewTerminated, 'OPEN' as status),
                    false,
                    false,
                    'LV25APL37',
                    'LV25APL37',
                    struct('a code' as code, 'a description' as description, 'a listName' as listname),
                    false,
                    'ST11006752',
                    [struct('a code' as code, 'a description' as description, 'a listName' as listname)]
                ), 
                'example termlength', NULL
        )
    ]
WHERE id = '7PHh1dN0HdVGCAzIDIVkPWQ4GjI3';