BigQuery: No hay firma para el operador sobre los datos públicos de Github
Estoy tratando de obtener algunas estadísticas de los datos públicos de GitHub en Google BigQuery.
Cuando ejecuto esta consulta sobre la base de datos de la muestra, funciona bien:
SELECT lang.name, COUNT(1) commits
FROM `bigquery-public-data.github_repos.sample_commits` c
join `bigquery-public-data.github_repos.languages` l on l.repo_name = c.repo_name,
unnest (l.language) as lang
GROUP BY lang.name
ORDER BY commits DESC
Pero cuando cambio la consulta a la base de datos de compromisos completos:
SELECT lang.name, COUNT(1) commits
FROM `bigquery-public-data.github_repos.commits` c
join `bigquery-public-data.github_repos.languages` l on l.repo_name = c.repo_name,
unnest (l.language) as lang
GROUP BY lang.name
ORDER BY commits DESC
Tengo este error:
No matching signature for operator = for argument types: STRING, ARRAY. Supported signature: ANY = ANY at [3:57]
Refiriéndose a repo_name
sobre el terreno commits
mesa.
Lo cual es muy extraño, porque el repo_name
tipo String
en ambos commits
y sample_commits
mesa.
¿Qué estoy haciendo mal?
Pregunta hecha hace 3 años, 4 meses, 29 días - Por cyberscribe
4 Respuestas:
-
A continuación debe abordar su problema actual
SELECT lang.name, COUNT(1) commits FROM `bigquery-public-data.github_repos.commits` c join `bigquery-public-data.github_repos.languages` l on l.repo_name in unnest(c.repo_name), unnest (l.language) as lang GROUP BY lang.name ORDER BY commits DESC
Respondida el Dec 17, 2020 a las 13:40 - por progprophet
Votos positivos: 0 | Votos negativos: 0 -
repo_name
se define comoSTRING REPEATED
en la mesa de commits, así que necesitas trabajar con ella como un array.Respondida el Dec 17, 2020 a las 13:50 - por techinnovator
Votos positivos: 0 | Votos negativos: 0 -
El error "No matching signature for operator =" que estás viendo se refiere a un problema con cómo estás comparando los datos en tu consulta SQL. En la consulta que intenta acceder a la tabla
bigquery-public-data.github_repos.commits
, estás tratando de unir la tablacommits
con la tablalanguages
utilizando la cláusulaON l.repo_name = c.repo_name
, donderepo_name
es un campo de tipo ARRAYen la tabla languages
.Para solucionar este problema, debes ajustar cómo haces la comparación entre los campos
repo_name
de las dos tablas. Dado querepo_name
es de tipo ARRAYen la tabla languages
, necesitas desanidar el campo antes de compararlo con el camporepo_name
de la tablacommits
.Aquí te dejo una forma de corregirlo utilizando la función
UNNEST
en la cláusulaON
para desanidar el camporepo_name
de la tablalanguages
antes de unir las tablas:sql SELECT lang.name, COUNT(1) commits FROM `bigquery-public-data.github_repos.commits` c JOIN `bigquery-public-data.github_repos.languages` l ON (SELECT array_agg(DISTINCT lang) FROM UNNEST(l.language) lang) = c.repo_name GROUP BY lang.name ORDER BY commits DESC
Con esta modificación, deberías poder realizar la comparación entre los campos de manera adecuada y obtener los resultados deseados en tu consulta sobre la base de datos de compromisos completos en BigQuery.
Respondida el Dec 18, 2020 a las 13:45 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
La diferencia entre tu consulta que funciona y la que falla es que en la consulta que falla, intentas unir la tabla
commits
con la tablalanguages
usando el operador=
, perorepo_name
es un campo de tipo ARRAY en la tablacommits
.Para unir correctamente estas tablas, debes usar el operador
UNNEST
para descomponer el campo ARRAYrepo_name
en la tablacommits
en valores individuales. Luego, puedes unir las tablas usando el operador=
.Aquí tienes la consulta corregida:
sql SELECT lang.name, COUNT(1) AS commits FROM `bigquery-public-data.github_repos.commits` c JOIN `bigquery-public-data.github_repos.languages` l ON UNNEST(c.repo_name) = l.repo_name GROUP BY lang.name ORDER BY commits DESC;
Respondida el Dec 18, 2020 a las 13:48 - por Gemini
Votos positivos: 0 | Votos negativos: 0