Conexiones de BigQuery
Puede usar AWS Glue para Spark para leer y escribir en tablas de Google BigQuery en AWS Glue 4.0 y versiones posteriores. Puede leer desde BigQuery con una consulta de SQL de Google. Se conecta BigQuery con las credenciales almacenadas en AWS Secrets Manager a través de una conexión de AWS Glue.
Para obtener más información sobre Google BigQuery, consulte el sitio web de Google Cloud BigQuery
Configuración de conexiones con BigQuery
Para conectarse a Google BigQuery desde AWS Glue, tendrá que crear y almacenar las credenciales de Google Cloud Platform en un secreto de AWS Secrets Manager y, a continuación, asociar ese secreto a una conexión de Google BigQuery para AWS Glue.
Para configurar una conexión a BigQuery, siga estos pasos:
En Google Cloud Platform, genere e identifique los recursos pertinentes:
Genere e identifique un proyecto de GCP que contenga tablas de BigQuery a las que desea conectarse.
Habilite la API de BigQuery. Para obtener más información, consulte Cómo usar la API de lectura de almacenamiento de BigQuery para leer datos de tablas
.
En Google Cloud Platform, genere y exporte las credenciales de la cuenta de servicio:
Puede usar el asistente de credenciales de BigQuery para simplificar este paso: Crear credenciales
. Para crear una cuenta de servicio en GCP, siga el tutorial disponible en Crear cuentas de servicio
. -
Al elegir un proyecto, seleccione el proyecto que contiene su tabla de BigQuery.
-
Cuando elija los roles de IAM de GCP para la cuenta de servicio, agregue o genere una función que conceda los permisos apropiados para ejecutar los trabajos en BigQuery, como la lectura, escritura o creación de tablas de BigQuery.
Para crear credenciales para la cuenta de servicio, siga el tutorial disponible en Crear una clave de cuenta de servicio
. -
Al seleccionar el tipo de clave, seleccione JSON.
Ahora debería haber descargado un archivo JSON que contiene las credenciales de la cuenta de servicio. Debería parecerse a lo que sigue:
{ "type": "service_account", "project_id": "*****", "private_key_id": "*****", "private_key": "*****", "client_email": "*****", "client_id": "*****", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "*****", "universe_domain": "googleapis.com" }
-
Codifique en base64 el archivo de credenciales descargado. En una sesión AWS CloudShell o similar, puede hacerlo desde la línea de comandos al ejecutar
cat
. Conserve el resultado de este comando,credentialsFile.json
| base64 -w 0credentialString
.En AWS Secrets Manager, genere un secreto mediante las credenciales de la plataforma de Google Cloud. Para crear un secreto en Secrets Manager, siga el tutorial disponible en Crear un secreto AWS Secrets Manager en la documentación AWS Secrets Manager. Después de crear el secreto, conserve el nombre secreto,
secretName
, para el siguiente paso.-
Al seleccionar pares clave/valor, genere un par para la clave
credentials
con el valorcredentialString
.
-
En el catálogo de datos de Glue AWS, cree una conexión mediante los pasos que se indican en Adición de una conexión de AWS Glue. Tras crear la conexión, conserve el nombre de la conexión,
connectionName
, para el siguiente paso.Cuando elija un Tipo de conexión, seleccione Google BigQuery.
Al seleccionar un secreto AWS, proporcione un
secretName
.
Otorgue al rol de IAM asociado al trabajo de AWS Glue el permiso para leer
secretName
.En la configuración del trabajo de Glue AWS, proporcione
connectionName
como una conexión de red adicional.
Lectura de tablas de BigQuery
Requisitos previos:
-
Una tabla de BigQuery desde la cual le gustaría leer. Necesitará los nombres de la tabla y el conjunto de datos de BigQuery, en el formulario
[dataset].[table]
. Llamemos a estotableName
. -
El proyecto de facturación para la tabla de BigQuery. Necesitará el nombre del proyecto,
parentProject
. Si no hay ningún proyecto principal de facturación, utilice el proyecto que contiene la tabla. -
Información de autenticación de BigQuery. Complete los pasos para administrar sus credenciales de conexión con AWS Glue para configurar su información de autenticación. Necesitará el nombre de la conexión de AWS Glue,
connectionName
.
Por ejemplo:
bigquery_read = glueContext.create_dynamic_frame.from_options( connection_type="bigquery", connection_options={ "connectionName": "
connectionName
", "parentProject": "parentProject
", "sourceType": "table", "table": "tableName
", }
También puede proporcionar una consulta para filtrar los resultados devueltos a su DynamicFrame. Tendrá que configurar query
, sourceType
, viewsEnabled
y materializationDataset
.
Por ejemplo:
Requisitos previos adicionales:
Deberá crear o identificar un conjunto de datos de BigQuery, materializationDataset
, en el que BigQuery pueda escribir vistas materializadas para las consultas.
Deberá otorgar los permisos de IAM GCP adecuados a la cuenta de servicio para crear tablas en materializationDataset
.
glueContext.create_dynamic_frame.from_options( connection_type="bigquery", connection_options={ "connectionName": "
connectionName
", "materializationDataset":materializationDataset
, "parentProject": "parentProject
", "viewsEnabled": "true", "sourceType": "query", "query": "select * from bqtest.test" } )
Escribir en tablas de BigQuery
En este ejemplo escribe directamente en el servicio de BigQuery. BigQuery también admite el método de escritura “indirecta”. Para obtener más información sobre la configuración de escritura indirecta, consulte Uso de escritura indirecta con Google BigQuery.
Requisitos previos:
-
Una tabla de BigQuery en la cual le gustaría escribir. Necesitará los nombres de la tabla y el conjunto de datos de BigQuery, en el formulario
[dataset].[table]
. También puede proporcionar un nombre de tabla nuevo que se creará automáticamente. Llamemos a estotableName
. -
El proyecto de facturación para la tabla de BigQuery. Necesitará el nombre del proyecto,
parentProject
. Si no hay ningún proyecto principal de facturación, utilice el proyecto que contiene la tabla. -
Información de autenticación de BigQuery. Complete los pasos para administrar sus credenciales de conexión con AWS Glue para configurar su información de autenticación. Necesitará el nombre de la conexión de AWS Glue,
connectionName
.
Por ejemplo:
bigquery_write = glueContext.write_dynamic_frame.from_options( frame=
frameToWrite
, connection_type="bigquery", connection_options={ "connectionName": "connectionName
", "parentProject": "parentProject
", "writeMethod": "direct", "table": "tableName
", } )
Referencia de opciones de conexión de BigQuery
-
project
: (Predeterminado): cuenta de servicio de Google Cloud predeterminada. Se utiliza para lectura/escritura. El nombre de un proyecto de Google Cloud asociado a la tabla. -
table
— (Obligatorio) Se utiliza para lectura/escritura. El nombre de la tabla de BigQuery en el formato[[project:]dataset.]
. -
dataset
(Obligatorio): cuando no se ha definido mediante la opcióntable
. Se utiliza para lectura/escritura. El nombre del conjunto de datos que contiene la tabla de BigQuery. -
parentProject
: (Predeterminado): cuenta de servicio de Google Cloud predeterminada. Se utiliza para lectura/escritura. El nombre de un proyecto de Google Cloud asociado aproject
que se utiliza para la facturación. -
sourceType
: se utiliza para leer. Obligatorio al leer. Valores válidos:table
,query
informa a AWS Glue si leerá por tabla o por consulta. -
materializationDataset
: se utiliza para leer. Valores válidos: cadenas. El nombre de un conjunto de datos de BigQuery que se utiliza para almacenar las materializaciones de las vistas. -
viewsEnabled
: se utiliza para leer. Valor predeterminado: falso. Valores válidos: true y false. Configura si BigQuery utilizará las vistas. -
query
: se utiliza para leer. Se utiliza cuandoviewsEnabled
es verdadero. Una consulta DQL de GoogleSQL. -
temporaryGcsBucket
: se utiliza para escribir. Obligatorio cuandowriteMethod
se establece en el valor predeterminado (indirect
). Nombre de un bucket de Google Cloud Storage que se utiliza para almacenar una forma intermedia de los datos mientras escribe en BigQuery. -
writeMethod
— Predeterminado:indirect
. Valores válidos:direct
,indirect
. Se utiliza para escribir. Especifica el método utilizado para escribir los datos.Si se establece en
direct
, el conector escribirá con la API de escritura de BigQuery Storage.Si se establece en
indirect
, el conector escribirá en Google Cloud Storage y, a continuación, lo transferirá a BigQuery mediante una operación de carga. Su cuenta de servicio de Google Cloud necesitará los permisos de GCS adecuados.
Uso de escritura indirecta con Google BigQuery
En este ejemplo, se usa la escritura indirecta, que escribe los datos en Google Cloud Storage y los copia en Google BigQuery.
Requisitos previos:
Necesitará un bucket temporal de Google Cloud Storage, llamado temporaryBucket
.
El rol de IAM de GCP de la cuenta de servicio de GCP de AWS Glue necesitará los permisos de GCS adecuados para acceder a temporaryBucket
.
Configuración adicional:
Para configurar la escritura indirecta con BigQuery, siga estos pasos:
Evalúe Configuración de conexiones con BigQuery y localice o vuelva a descargar el archivo JSON de credenciales de GCP. Identifique
secretName
, el secreto de AWS Secrets Manager de la conexión Google BigQuery para AWS Glue que se utiliza en el trabajo.-
Cargue el archivo JSON de sus credenciales a una ubicación de Amazon S3 con la seguridad adecuada. Conserve la ruta del archivo,
s3secretpath
, para pasos futuros. -
Edite el
secretName
y agregue la clavespark.hadoop.google.cloud.auth.service.account.json.keyfile
. Establezca el valor ens3secretpath
. -
Otorgue permisos de IAM para AWS Glue en Amazon S3 para acceder a
s3secretpath
.
Ahora puede proporcionar la ubicación temporal de su bucket de GCS a su método de escritura. No es necesario proporcionar writeMethod
, ya que indirect
históricamente es el valor predeterminado.
bigquery_write = glueContext.write_dynamic_frame.from_options( frame=
frameToWrite
, connection_type="bigquery", connection_options={ "connectionName": "connectionName
", "parentProject": "parentProject
", "temporaryGcsBucket": "temporaryBucket
", "table": "tableName
", } )