我正在使用标准SQL查询从Firebase导出的BigQuery数据集。每当我将通配符查询与条件Cannot read field 'user_properties' of type STRUCT as STRING
一起使用时,我都会得到_TABLE_SUFFIX
,但是当我不使用通配符查询时,它会起作用。
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))
)
答案 0 :(得分:3)
使用Wildcard Tables时-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>'