Как объединить два массива разных типов данных в BigQuery? - PullRequest
0 голосов
/ 26 января 2019

Когда я пытаюсь объединить два массива с одним и тем же типом данных, все работает отлично.

Пример показан ниже

#standardSQL
WITH
  table1 AS (
  SELECT 'a' id UNION ALL
  SELECT 'b' UNION ALL
  SELECT 'c'
  ),
  table2 AS (
  SELECT 'a' id, [1,2,3,4,5] array_1 UNION ALL
  SELECT 'b', [1,2,3,4,5] UNION ALL
  SELECT 'c', [1,2,3,4,5]
  ),
  table3 AS (
  SELECT 'a' id, [10,20,30,40,50] array_2 UNION ALL
  SELECT 'b', [10,20,30,40,50] UNION ALL
  SELECT 'c', []
  ),
  joined_table as (
  select table1.id,
  table2.array_1,
  table3.array_2
  from 
    table1
  JOIN table2
  USING(id)
  JOIN table3
  using(id)
  )
SELECT
  joined_table.*,
  ARRAY_CONCAT(IFNULL(joined_table.array_1,[]), IFNULL(joined_table.array_2,[])) as concatanated_arrays
  FROM joined_table

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

#standardSQL
WITH
  table1 AS (
  SELECT 'a' id UNION ALL
  SELECT 'b' UNION ALL
  SELECT 'c'
  ),
  table2 AS (
  SELECT 'a' id, [1,2,3,4,5] array_1 UNION ALL
  SELECT 'b', [1,2,3,4,5] UNION ALL
  SELECT 'c', [1,2,3,4,5]
  ),
  table3 AS (
  SELECT 'a' id, ['10','20','30','40','50'] array_2 UNION ALL
  SELECT 'b', ['10','20','30','40','50'] UNION ALL
  SELECT 'c', []
  ),
  joined_table as (
  select table1.id,
  table2.array_1,
  table3.array_2
  from 
    table1
  JOIN table2
  USING(id)
  JOIN table3
  using(id)
  )
SELECT
  joined_table.*,
  ARRAY_CONCAT(IFNULL(joined_table.array_1,[]), IFNULL(joined_table.array_2,[])) as concatanated_arrays
  FROM joined_table

мой запрос не запускается и выдает ошибку, подобную этой:

Error: No matching signature for function ARRAY_CONCAT for argument types: ARRAY<INT64>, ARRAY<STRING>. Supported signature: ARRAY_CONCAT(ARRAY, [ARRAY, ...]) at [31:3]

Как объединить эти два массива разного типа?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Альтернативная (более легкая) версия - BigQuery Standard SQL

#standardSQL
SELECT id, 
  ARRAY(
    SELECT CAST(val AS STRING) FROM t.array_1 val UNION ALL 
    SELECT * FROM t.array_2
  ) concatanated_arrays
FROM joined_table t   

Если применить к рассматриваемым образцам данных - дает ожидаемый результат

0 голосов
/ 26 января 2019

Массивы с разными типами данных не могут быть объединены в BigQuery.При объединении массивов необходимо, чтобы типы данных были одинаковыми.

Один из способов решения рассматриваемой проблемы - преобразование целочисленных массивов в строку и последующее объединение их для получения объединенного массива.

Следующий запрос может быть использован в BigQuery standard-sql для демонстрации одного такого примера:

#standardSQL
WITH
  table1 AS (
  SELECT 'a' id UNION ALL
  SELECT 'b' UNION ALL
  SELECT 'c'
  ),
  table2 AS (
  SELECT 'a' id, [1,2,3,4,5] array_1 UNION ALL
  SELECT 'b', [1,2,3,4,5] UNION ALL
  SELECT 'c', [1,2,3,4,5]
  ),
  table3 AS (
  SELECT 'a' id, ['10','20','30','40','50'] array_2 UNION ALL
  SELECT 'b', ['10','20','30','40','50'] UNION ALL
  SELECT 'c', []
  ),
  joined_table as (
  select table1.id,
  table2.array_1,
  table3.array_2
  from 
    table1
  JOIN table2
  USING(id)
  JOIN table3
  using(id)
  )
SELECT
  joined_table.*,
  ARRAY_CONCAT(IFNULL(ARRAY(SELECT CAST(value as string) FROM UNNEST(joined_table.array_1) value),[]), IFNULL(joined_table.array_2,[])) as concatanated_arrays
  FROM joined_table

Но в результате окончательное concatenated_arrays становится повторяющимся строковым полем.

...