Google bigquery BigQuery-联合时的不兼容类型?--快把我逼疯了
下面是我的查询的简化版本。调试表中的DebugReason类型为INTEGER,DebugData类型为STRING。GPS表中没有这两个字段,所以我用空值伪造了它。我需要这样做的原因和这个问题无关,长话短说,我在下面的过程中需要它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"
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来伪造该列,以便进行联合。米克霍尔的回答解决了这个问题。不过,再次感谢您花时间看这个!