foto by: @mitchel3uo

Introduccion a BigQuery para Big Data

Martin Manriquez Leon
GDG IPN
Published in
4 min readJan 15, 2020

--

BigQuery nos permite obtener datos de almacenes distribuidos mediante consultas SQL. Bastante simple. Sin embargo, detrás de escena, se realizan muchas hazañas de ingeniería para garantizar las funcionalidades y el determinismo de las consultas SQL sobre sistemas distribuidos. Al usar BigQuery, inicialmente podemos obtener un pequeño subconjunto de datos para entrenar localmente nuestros modelos, y luego entrenar nuestro modelo final en la nube usando el conjunto de datos completo de BigQuery.

BigQuery es un servicio proporcionado desde Google Cloud Platform, para lo cual necesita una tarjeta de crédito. Suponiendo que tienes una tarjeta de crédito, no te preocupe, los cargos son mínimos ademas si aperturas tu cuenta de G Cloud contaras con 300 dolares para usar durante el primer año.

Primero, necesitamos crear un Storage Bucket. Elige un cubo regional. Es seguro elegir la misma región para todos los demás servicios que podrían usar BigQuery, como Datalabel portátil IPython alojado en GCP. Ve a Navigation menu->Storage->Browsery luego haz clic Create bucket. La interfaz de usuario puede cambiar un poco, por lo que puedes necesitar explorar un poco.

Hablando de eso, si queremos ejecutar IPython dentro de GCP, podemos iniciar Cloud Datalab para consultar nuestro almacenamiento BigQuery. Podríamos hacerlo localmente utilizando las API de BigQuery para Python, pero es más simple dentro de Datalab porque la autenticación y otras tareas se aseguran automáticamente. Además, los códigos de Python son los mismos para cualquier entorno.

  • Dentro de nuestro GCP, abre la terminal Cloud Shell.
  • Lista las zonas disponibles usando gcloud compute zones list.
  • Crea un lab usando datalab create labnamevm --zone <ZONE>.
  • Para volver a conectarse a la instancia Datalab creado previamente, datalab connect labnamevm.
  • En Cloud Shell, sigue las indicaciones. Si se le solicita la frase de contraseña ssh, presiona la tecla de retorno para que no haya frase de contraseña.
  • Una vez que se crea la instancia de Datalab, abre la Vista previa web desde la esquina superior derecha de la cinta de Cloud Shell.
  • Crea un nuevo notebook haciendo clic en el icono en la esquina superior izquierda.

Ahora, consultaremos BigQuery usando python. Utilizaremos un conjunto de datos de muestra proporcionado en Google Cloud Platform. Para nuestros propios datos, podemos subirlos primero al depósito de almacenamiento creado.

# Creamos una consulta SQL utilizando datos de natalidad después del año 2000 
query = """
SELECT
weight_pounds,
is_male,
mother_age,
plurality,
gestation_weeks,
ABS(FARM_FINGERPRINT(CONCAT(CAST(YEAR AS STRING), CAST(month AS STRING)))) AS hashmonth
FROM
publicdata.samples.natality
WHERE year > 2000
"""import google.datalab.bigquery as bq
df = bq.Query(query + " LIMIT 100").execute().result().to_dataframe()
df.head()

Aquí, estamos ejecutando la consulta y limitando la respuesta a 100 registros, obteniendo la respuesta y convirtiéndola en un marco de datos. Bastante conveniente!

La siguiente es una salida de muestra del código.

Para contar el número total de registros que la consulta anterior recuperaría sin el LÍMITE:

countQuery = "SELECT COUNT (weight_pounds) FROM (" + query + ")

Supongamos que queremos crear un conjunto de tren y prueba, de modo que los conjuntos sean distintos. Sin embargo, puede haber más de copias del mismo registro que podrían terminar distribuidas en los dos conjuntos. Para manejar el escenario, podríamos calcular un hash de una combinación de campos y ejecutar condicionales en el valor hash para realizar selecciones distintas.

query = "" " 
SELECT
weight_pounds,
is_male,
mother_age,
plurality,
gestation_weeks,
MOD (ABS (FARM_FINGERPRINT (CONCAT (CAST (is_male as string)), CAST (AÑO COMO STRING), CAST (mes AS STRING)))), 10) AS hashmonth
DE
publicdata.samples.natality
WHERE MOD (ABS (FARM_FINGERPRINT (CONCAT (CAST (is_male as string)), CAST (YEAR AS STRING), CAST (month AS STRING)))), 10)> = 8
"" " df = bq.Query (query1) .execute (). result (). to_dataframe ()
df.head ()

Salida:

La consulta anterior devolverá todos los datos que cumplan las condiciones. Supongamos que solo queremos el 10% de los datos para probar nuestras ideas, en cuyo caso podemos modificar la cláusula WHERE con la función rand () :

WHERE MOD (ABS (FARM_FINGERPRINT (CONCAT (CAST (is_male as string)), CAST (YEAR AS STRING), CAST (month AS STRING))), 10)> = 8 y rand () <0.1

Supongamos que queremos eliminar los registros que tienen NaNen ciertas columnas:

importar pandas como pd 
df1 = df [pd.notnull (df.plurality)]

Supongamos que queremos asignar los valores de una columna a otra cosa:

pluralityMapper = dict (zip ([1,2,3,4,5], 
['Single (1)', 'Twins (2)', 'Triplets (3)', 'Quadruplets (4)', 'Quintuplets ( 5) '])) df1 [' pluralidad ']. Replace (pluralityMapper, inplace = True)

Veamos el marco de datos modificado:

df.head ()

Podemos exportar el marco de datos como archivos CSV:

df.to_csv ('test.csv', index = False, header = False)

Seguiré agregando cosas a medida que aprenda. Si me perdí algo o cometí un error, comentalo que le daremos solucion lo antes posible. ¡Salud!

--

--

Martin Manriquez Leon
GDG IPN

GDG and Facebook Deveveloper Circle Lead 💙Passionate about M.L.🔬 DataSciences 🧮 & Astronomy 🛰