Как изменить тип col повторной записи BigQuery - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь изменить тип столбца повторяющейся записи с STRING на TIMESTAMP.Здесь есть несколько предложений из документации BQ ( вручную-изменяющиеся схемы ).Однако у меня возникают проблемы с каждым из рекомендуемых предложений.

Вот пример схемы:

{
  'name' => 'id',
  'type' => 'STRING',
  'mode' => 'REQUIRED'
},
{
  'name' => 'name',
  'type' => 'STRING',
  'mode' => 'REQUIRED'
},
// many more fields including nested records and repeated records
{
  'name' => 'locations',
  'type' => 'RECORD',
  'mode' => 'REPEATED',
  'fields' => [
    {
      'name' => 'city',
      'type' => 'STRING',
      'mode' => 'REQUIRED'
    },
    {
      'name' => 'updated_at',
      'type' => 'STRING',   // ** want this as TIMESTAMP **
      'mode' => 'REQUIRED'
    },
  ]
}

Проблема с использованием запроса:

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

Проблема с экспортом таблицыкак JSON:

При экспорте таблицы в формате JSON она экспортирует необработанные представления данных в формате json (с картами и словарями, как мы и ожидали).

Однако мы не можем импортировать эти необработанные данные обратно в BQ:

BigQuery не поддерживает карты или словари в JSON.Например, «product_categories»: {«my_product»: 40.0} недопустимо, но «product_categories»: {«column1»: «my_product», «column2»: 40.0} допустимо.

https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-json#limitations

Будем благодарны за любые предложения!

1 Ответ

3 голосов
/ 03 апреля 2019

Ниже ответ основан на том, что: REPEATED RECORD тип в BigQuery StandardSQL представлен как тип ARRAY<STRUCT<f1 f1_type, f2 f2_type ... >>.

Это не мое любимое, так как вы должны указать полный список столбцов. Может быть, есть лучший способ.

#standardSQL
-- Build sample data, try to mimic what's in question.
CREATE OR REPLACE TABLE
  <your_dataset>.sample_table AS
SELECT name, 
       array<struct<city string, update_at string>>[("SFO", "2011-1-1"), ("SEA", "2022-2-2")] 
       as locations
FROM UNNEST(['Name1', "Name2", "Name3"]) as name;

enter image description here enter image description here

Тогда ниже SQL преобразует столбец update_at в DATE и сохраняет в новую таблицу (или ту же, если хотите).

#standardSQL
CREATE OR REPLACE TABLE
  <your_dataset>.output_table AS
SELECT * REPLACE (
   ARRAY(SELECT AS STRUCT * REPLACE(CAST(update_at AS DATE) AS update_at)
         FROM UNNEST(locations)) 
   AS locations 
   )
FROM
  <your_dataset>.sample_table;

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...