使用 _TABLE_SUFFIX 查询时,无法将 STRUCT 类型的字段“user_properties”读取为 STRING
Posted
技术标签:
【中文标题】使用 _TABLE_SUFFIX 查询时,无法将 STRUCT 类型的字段“user_properties”读取为 STRING【英文标题】:Cannot read field 'user_properties' of type STRUCT as STRING when querying with _TABLE_SUFFIX 【发布时间】:2019-10-27 19:13:56 【问题描述】:我正在使用标准 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))
)
【问题讨论】:
【参考方案1】:当使用 Wildcard Tables 时 - BigQuery 引擎首先识别与通配符匹配的最早创建的对象,并使用该对象来识别架构。只有这样——使用该模式——匹配的表才会被查询。
所以我猜你最有可能发生什么 - 你有较早的表或视图与 analytics_<firebase_id>.events_*
匹配,其中字段 user_properties
为字符串类型 - 而在 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>'
【讨论】:
你是对的。事实证明我确实有一些奇怪的表名可以匹配 events_*。如果我将其更改为201910*
它可以工作。谢谢!以上是关于使用 _TABLE_SUFFIX 查询时,无法将 STRUCT 类型的字段“user_properties”读取为 STRING的主要内容,如果未能解决你的问题,请参考以下文章
具有多个 _TABLE_SUFFIX 条件的嵌套查询的意外结果
如何使用通配符表语法(如 _TABLE_SUFFIX)加入 INFORMATION_SCHEMA 元数据,以便在 Google Big Query 中通过 table_name 获得结果