使用 _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_&lt;firebase_id&gt;.events_* 匹配,其中字段 user_properties 为字符串类型 - 而在 analytics_&lt;firebase_id&gt;.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 字符串比较与整数

查询失败错误:无法通过前缀查询视图。匹配视图的部分列表是

如何使用通配符表语法(如 _TABLE_SUFFIX)加入 INFORMATION_SCHEMA 元数据,以便在 Google Big Query 中通过 table_name 获得结果

如何设置包含当前日期的日期范围的 BigQuery 查询

带有 BigQuery 的动态表后缀不限制处理的数据