使用_TABLE_SUFFIX查询时,无法将STRUCT类型的字段'user_properties'读取为STRING

时间:2019-10-27 19:13:56

标签: google-bigquery

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

1 个答案:

答案 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>'