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 como STRING 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 tabla commits con la tabla languages utilizando la cláusula ON l.repo_name = c.repo_name, donde repo_name es un campo de tipo ARRAY en 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 que repo_name es de tipo ARRAY en la tabla languages, necesitas desanidar el campo antes de compararlo con el campo repo_name de la tabla commits.

    Aquí te dejo una forma de corregirlo utilizando la función UNNEST en la cláusula ON para desanidar el campo repo_name de la tabla languages 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 tabla languages usando el operador =, pero repo_name es un campo de tipo ARRAY en la tabla commits.

    Para unir correctamente estas tablas, debes usar el operador UNNEST para descomponer el campo ARRAY repo_name en la tabla commits 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