BigQuery - UNION ALL 的类型不兼容?

fox*_*ndy 5 google-bigquery

以下是我的查询的简化版本。Debug 表中的 DebugReason 类型为INTEGER,DebugData 类型为STRING。GPS 表中没有这样的两个字段,所以我用 all 伪造了它NULL。我需要这样做的原因与这个问题无关,长话短说,我在接下来的一些过程中需要它

 WITH RawDebug as 
(
  SELECT 
  STRUCT(DebugReason,DebugData) as Debug
  FROM `devicedata.Debug.T*`
  WHERE _TABLE_SUFFIX="20180624"

),
RawGPS AS (        
       SELECT
          STRUCT(null as DebugReason,null as DebugData) as Debug
        FROM
          `devicedata.Gps.T*` AS g
         WHERE _TABLE_SUFFIX="20180624"

)
select Debug
from RawDebug
UNION ALL
select Debug
from RawGPS
Run Code Online (Sandbox Code Playgroud)

BigQuery 说:

Error: Column 1 in UNION ALL has incompatible types: STRUCT<DebugReason INT64, DebugData STRING>, STRUCT<DebugReason INT64, DebugData INT64> at [18:1]
Run Code Online (Sandbox Code Playgroud)

我不知道出了什么问题......以及如何纠正?

Ell*_*ard 7

在联合中的一个查询中,该DebugData字段的类型为 type STRING,而在另一个查询中,该字段的类型为 type INT64。如果你想要一致的类型,你需要强制转换:

WITH RawDebug as 
(
  SELECT 
  STRUCT(DebugReason,DebugData) as Debug
  FROM `devicedata.Debug.T*`

),
RawGPS AS (        
       SELECT
          STRUCT(
            null as DebugReason,
            CAST(DebugData AS STRING) AS DebugData -- note the cast
          ) as Debug
        FROM
          `devicedata.Gps.T*` AS g

)
select Debug
from RawDebug
UNION ALL
select Debug
from RawGPS
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为 的默认类型NULLINT64.


Mik*_*ant 3

另一种选择是显式指定 STRUCT,如下所示

WITH RawDebug AS 
(
  SELECT 
  STRUCT(DebugReason,DebugData) AS Debug
  FROM `devicedata.Debug.T*`
  WHERE _TABLE_SUFFIX="20180624"
),
RawGPS AS (        
       SELECT
          STRUCT<DebugReason INT64, DebugData STRING>(NULL, NULL) AS Debug
        FROM
          `devicedata.Gps.T*` AS g
         WHERE _TABLE_SUFFIX="20180624"
)
SELECT Debug
FROM RawDebug
UNION ALL
SELECT Debug
FROM RawGPS
Run Code Online (Sandbox Code Playgroud)