使用 STRUCT 查询时无法将 STRUCT 类型的字段"user_properties"读取为字符串_TABLE_SUFFIX



我正在使用标准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>'

最新更新