我正在使用标准SQL查询从Firebase导出的BigQuery数据集。每当我使用带有条件_TABLE_SUFFIX
的通配符查询时,我都会得到Cannot read field 'user_properties' of type STRUCT as STRING
,但当我不使用通配符查询时会起作用。
SELECT
_TABLE_SUFFIX AS suffix,
user_properties
FROM
`analytics_<firebase_id>.events_*`
WHERE
_TABLE_SUFFIX = '20191026'
AND
app_info.id = '<my_app_id>'
收到错误Cannot read field 'user_properties' of type STRUCT as STRING
如果我将查询更改为
SELECT
user_properties
FROM
`analytics_<firebase_id>.events_20191026`
WHERE
app_info.id = '<my_app_id>'
它返回预期结果。
和一个健全性检查
SELECT
DISTINCT(_TABLE_SUFFIX) AS suffix
FROM
`analytics_<firebase_id>.events_*`
WHERE
_TABLE_SUFFIX = '20191026'
AND
app_info.id = '<my_app_id>'
它按预期返回"20191026"。
我不明白为什么使用通配符会导致不同类型的user_properties
。这种情况以前也发生在我身上,当我在几个小时后重试时,它就起了作用。我非常怀疑这是一个BigQuery错误,但他们的支持让我走到了这里。
(我必须使用_TABLE_SUFFIX的原因是我需要将日期作为参数传递。在我的实际代码中,ETL作业是_TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(DATE(@run_time), INTERVAL 1 DAY))
(
当使用通配符表时,BigQuery引擎首先识别最早创建的与通配符匹配的对象,并使用该对象来识别模式。只有到那时,才使用该模式匹配的表进行查询。
因此,我猜测最有可能发生的事情是什么——您有与analytics_<firebase_id>.events_*
匹配的早期表或视图,其中字段user_properties
为STRING类型——而在analytics_<firebase_id>.events_20191026
中,该字段为STRUCT 类型
您需要确保所有匹配通配符的对象都有相同的模式,以免出现类似的问题
要测试这一点,只需运行下面的示例
SELECT
_TABLE_SUFFIX AS suffix,
user_properties
FROM
`analytics_<firebase_id>.events_201910*`
WHERE
_TABLE_SUFFIX = '26'
AND
app_info.id = '<my_app_id>'