BigQuery中的错误或新行为?

时间:2016-08-12 12:35:12

标签: google-bigquery

自两天前(2016年8月10日)以来,曾经工作的查询(使用BQ Export for Google Analytics Premium的表格)已停止工作。它返回以下错误:

  

错误:无法联合表:不兼容的类型。   ' hits.latencyTracking.userTimingVariable' :TYPE_INT64   ' hits.latencyTracking.userTimingVariable' :TYPE_STRING

经过一些调查后,当我在8月10日之前和之后查询表时(表 ga_sessions_20160810 ),在WHERE子句中使用IN似乎是一个问题。

我已将原始查询简化为提供具有相同基本结构的虚拟查询。以下查询有效(查询2016-08-08和2016-08-09的数据):

SELECT fullVisitorId, sum(totals.visits)
FROM (select * from TABLE_DATE_RANGE([XXXXXXXX.ga_sessions_],TIMESTAMP('2016-08-08'),TIMESTAMP('2016-08-09')))
WHERE fullVisitorId in(
    SELECT fullVisitorId
    FROM TABLE_DATE_RANGE([XXXXXXXX.ga_sessions_],TIMESTAMP('2016-08-08'),TIMESTAMP('2016-08-09'))
)
GROUP BY fullVisitorId

但是另一个(只是更改日期,在本例中是2016-08-09和2016-08-10)会返回错误:

SELECT fullVisitorId, sum(totals.visits)
FROM (select * from TABLE_DATE_RANGE([XXXXXXXX.ga_sessions_],TIMESTAMP('2016-08-09'),TIMESTAMP('2016-08-10')))
WHERE fullVisitorId in(
    SELECT fullVisitorId
    FROM TABLE_DATE_RANGE([XXXXXXXX.ga_sessions_],TIMESTAMP('2016-08-09'),TIMESTAMP('2016-08-10'))
)
GROUP BY fullVisitorId

如果我删除WHERE子句或者我只是在IN中尝试查询,那么最后一个查询工作正常,所以我猜问题是结构WHERE field IN(...) 。此外,仅查询2016-08-10的数据确实有效。此外,使用与fullVisitorId不同的字段并在不同的BQ项目中运行相同的查询也会发生同样的情况。

查看错误描述,它应该是变量类型的问题,但我不知道什么是hits.latencyTracking.userTimingVariable。我的查询过去常常正常工作,所以我无法弄清楚产生错误的变化。有些字段改变了类型或发生了什么?

有没有人经历过这个?这是BigQuery中的错误还是新行为?如何解决这个错误?

2 个答案:

答案 0 :(得分:2)

当您在select子句中使用*时,它可能会在union尝试组合两种不同的列类型(因为架构从INT64更改为STRING)时引起问题。

我有两种方法

1)仅使用您所需的字段而不是在select子句

中使用*
SELECT fullVisitorId, sum(totals.visits)
 FROM (select fullVisitorId,totals.visits from TABLE_DATE_RANGE([XXXXXXXX.ga_sessions_],TIMESTAMP('2016-08-09'),TIMESTAMP('2016-08-10')))
  WHERE fullVisitorId in(
   SELECT fullVisitorId
    FROM TABLE_DATE_RANGE([XXXXXXXX.ga_sessions_],TIMESTAMP('2016-08-09'),TIMESTAMP('2016-08-10'))
  ) GROUP BY fullVisitorId

2)使用视图拆分内部查询并在查询中稍后使用该视图。 (即使在视图中你只需要使用那些必需的字段)

SELECT fullVisitorId, sum(totals.visits)
 FROM [view.innertable2]
  WHERE fullVisitorId in(
    SELECT fullVisitorId from [view.innertable1] ) GROUP BY fullVisitorId

这将排除hits.latencyTracking.userTimingVariable,因此不会出现错误。

答案 1 :(得分:0)

如果要查询的字段是兼容的,则可以尝试使用标准SQL通配符表(如果从UI执行此操作,则必须取消选中“使用旧SQL”框)。像这样:

$.getJSON(
  'https://en.wikipedia.org/w/api.php?action=query&format=json&gsrlimit=15&generator=search' +
  '&origin=*' + // <-- this is the magic ingredient!
  '&gsrsearch='q, function(data){ /* ... */ }
);
相关问题