Google bigquery BigQuery-联合时的不兼容类型?--快把我逼疯了

Google bigquery BigQuery-联合时的不兼容类型?--快把我逼疯了,google-bigquery,Google Bigquery,下面是我的查询的简化版本。调试表中的DebugReason类型为INTEGER,DebugData类型为STRING。GPS表中没有这两个字段,所以我用空值伪造了它。我需要这样做的原因和这个问题无关,长话短说,我在下面的过程中需要它 WITH RawDebug as ( SELECT STRUCT(DebugReason,DebugData) as Debug FROM `devicedata.Debug.T*` WHERE _TABLE_SUFFIX="20180624"

下面是我的查询的简化版本。调试表中的DebugReason类型为INTEGER,DebugData类型为STRING。GPS表中没有这两个字段,所以我用空值伪造了它。我需要这样做的原因和这个问题无关,长话短说,我在下面的过程中需要它

 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
BigQuery说:

Error: Column 1 in UNION ALL has incompatible types: STRUCT<DebugReason INT64, DebugData STRING>, STRUCT<DebugReason INT64, DebugData INT64> at [18:1]

我弄不清哪里出了问题……以及如何纠正它?

在union中的一个查询中,DebugData字段的类型为STRING,而在另一个查询中,它的类型为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

出现这种情况的原因是NULL的默认类型为INT64。

在union中的一个查询中,DebugData字段的类型为STRING,而在另一个查询中,它的类型为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

之所以会出现这种情况,是因为默认的NULL类型是INT64。

另一个选项是显式指定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

另一个选项是显式指定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

谢谢你的回复。对我来说,NULL的默认类型是INT64是有意义的。但是,您的建议不适用于我的情况,在Gps.t*表中没有DebugData,我需要NULL来伪造该列,以便进行联合。米克霍尔的回答解决了这个问题。不过,再次感谢您花时间看这个!谢谢你的回复。对我来说,NULL的默认类型是INT64是有意义的。但是,您的建议不适用于我的情况,在Gps.t*表中没有DebugData,我需要NULL来伪造该列,以便进行联合。米克霍尔的回答解决了这个问题。不过,再次感谢您花时间看这个!