Desde hace dos días (10 de agosto de 2016), una consulta que solía funcionar (usando tablas de BQ Export para Google Analytics Premium) dejó de funcionar. Devuelve el siguiente error:

Error: no se pueden unir tablas: tipos incompatibles. 'hits.latencyTracking.userTimingVariable': TYPE_INT64 'hits.latencyTracking.userTimingVariable': TYPE_STRING

Después de algunas investigaciones, parece haber un problema con el uso de IN en una cláusula WHERE cuando consulto tablas antes y después del 10 de agosto (tabla ga_sessions_20160810 ).

He simplificado mi consulta original para proporcionar una falsa que tiene la misma estructura básica. La siguiente consulta funciona (consulta de datos de 2016-08-08 y 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

Pero este otro (solo cambiando las fechas, en este caso desde 2016-08-09 y 2016-08-10) devuelve el error:

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

Esta última consulta funciona bien si elimino la cláusula WHERE o si simplemente intento la consulta dentro de IN, así que supongo que el problema está en la estructura WHERE field IN (...). Además, consultar solo datos de 2016-08-10 funciona. Además, ocurre lo mismo al usar un campo diferente a fullVisitorId y ejecutar las mismas consultas en diferentes proyectos de BQ.

Mirando la descripción del error, debería ser un problema con los tipos de variables, pero no sé qué es hits.latencyTracking.userTimingVariable. Mi consulta solía funcionar correctamente, por lo que no puedo averiguar qué ha cambiado que produce el error. ¿Han cambiado algunos campos de tipo o qué pasó?

Alguien ha experimentado esto? ¿Es un error o un comportamiento nuevo en BigQuery? ¿Cómo se puede solucionar este error?

4
Pol Ferrando 12 ago. 2016 a las 15:35

2 respuestas

La mejor respuesta

Como está usando * en la cláusula de selección, podría causar problemas cuando se produce la unión, al intentar combinar dos tipos de columnas diferentes (ya que el esquema cambió de INT64 a STRING).

Tengo dos enfoques

1) use solo los campos requeridos por usted que usar * en la cláusula de selección

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) usar vistas para dividir consultas internas y usar la vista más adelante en la consulta. (incluso a la vista, debe usar solo aquellos campos que son obligatorios)

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

Esto excluirá el hits.latencyTracking.userTimingVariable por lo que no habrá ningún error.

2
ck reddy 17 ago. 2016 a las 17:35

Si los campos que está consultando son compatibles, puede intentar usar tablas comodín de SQL estándar (tendrá que desmarcar la casilla Usar SQL heredado si lo hace desde la interfaz de usuario). Algo como esto:

SELECT fullVisitorId, sum(totals.visits) 
FROM `xxxxxxxx.ga_sessions_*`
WHERE _TABLE_SUFFIX BETWEEN '20160808' and '20160810'
GROUP BY fullVisitorId;
0
Pavan Edara 12 ago. 2016 a las 15:20