Cargar datos desde exportaciones de Firestore

BigQuery admite la carga de datos de Firestore exportados mediante el servicio de importación y exportación gestionado de Firestore. El servicio de importación y exportación gestionado exporta documentos de Firestore a un segmento de Cloud Storage. Después, puede cargar los datos exportados en una tabla de BigQuery.

Limitaciones

Cuando cargas datos en BigQuery desde una exportación de Firestore, ten en cuenta las siguientes restricciones:

  • El conjunto de datos debe estar en la misma ubicación que el segmento de Cloud Storage que contiene los archivos de exportación.
  • Solo puedes especificar un URI de Cloud Storage y no puedes usar un comodín de URI.
  • Para que una exportación de Firestore se cargue correctamente, los documentos de los datos exportados deben compartir un esquema coherente con menos de 10.000 nombres de campo únicos.
  • Puedes crear una tabla para almacenar los datos o sobrescribir una que ya tengas. No puedes añadir datos de exportación de Firestore a una tabla que ya tengas.
  • Tu comando de exportación debe especificar un filtro collection-ids. Los datos exportados sin especificar un filtro de ID de colección no se pueden cargar en BigQuery.

Antes de empezar

Concede roles de gestión de identidades y accesos (IAM) que proporcionen a los usuarios los permisos necesarios para realizar cada tarea de este documento.

Permisos obligatorios

Para cargar datos en BigQuery, necesitas permisos de gestión de identidades y accesos para ejecutar un trabajo de carga y cargar datos en tablas y particiones de BigQuery. Si cargas datos desde Cloud Storage, también necesitas permisos de IAM para acceder al segmento que contiene tus datos.

Permisos para cargar datos en BigQuery

Para cargar datos en una tabla o partición de BigQuery, o bien para añadir o sobrescribir una tabla o partición, necesitas los siguientes permisos de gestión de identidades y accesos:

  • bigquery.tables.create
  • bigquery.tables.updateData
  • bigquery.tables.update
  • bigquery.jobs.create

Cada uno de los siguientes roles de gestión de identidades y accesos predefinidos incluye los permisos que necesitas para cargar datos en una tabla o partición de BigQuery:

  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • roles/bigquery.admin (incluye el permiso bigquery.jobs.create)
  • bigquery.user (incluye el permiso bigquery.jobs.create)
  • bigquery.jobUser (incluye el permiso bigquery.jobs.create)

Además, si tienes el permiso bigquery.datasets.create, puedes crear y actualizar tablas mediante un trabajo de carga en los conjuntos de datos que crees.

Para obtener más información sobre los roles y permisos de IAM en BigQuery, consulta el artículo sobre funciones y permisos predefinidos.

Permisos para cargar datos desde Cloud Storage

Para obtener los permisos que necesitas para cargar datos desde un segmento de Cloud Storage, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de Storage (roles/storage.admin) en el segmento. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para cargar datos desde un segmento de Cloud Storage. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para cargar datos desde un segmento de Cloud Storage, se necesitan los siguientes permisos:

  • storage.buckets.get
  • storage.objects.get
  • storage.objects.list (required if you are using a URI wildcard)

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Cargar datos del servicio de exportación de Firestore

Puedes cargar datos desde un archivo de metadatos de exportación de Firestore mediante la Google Cloud consola, la herramienta de línea de comandos bq o la API.

A veces, se usa la terminología de Datastore en la Google Cloud consola y en la herramienta de línea de comandos bq, pero los siguientes procedimientos son compatibles con los archivos de exportación de Firestore. Firestore y Datastore comparten un formato de exportación.

Consola

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos.
  3. En la sección Información del conjunto de datos, haz clic en Crear tabla.
  4. En el panel Crear tabla, especifica los siguientes detalles:
    1. En la sección Fuente, selecciona Google Cloud Storage en la lista Crear tabla a partir de. A continuación, siga estos pasos:
      1. Selecciona un archivo del segmento de Cloud Storage o introduce el URI de Cloud Storage. No puedes incluir varias URIs en la consola Google Cloud , pero sí caracteres comodín. El segmento de Cloud Storage debe estar en la misma ubicación que el conjunto de datos que contiene la tabla que quieres crear, añadir o sobrescribir.
        El URI del archivo de exportación de Firestore debe terminar con KIND_COLLECTION_ID.export_metadata. Por ejemplo, en default_namespace_kind_Book.export_metadata, Book es el ID de la colección y default_namespace_kind_Book es el nombre de archivo generado por Firestore. Si el URI no termina con KIND_COLLECTION_ID.export_metadata, recibirás el siguiente mensaje de error: does not contain valid backup metadata. (código de error: no válido). Seleccionar el archivo de origen para crear una tabla de BigQuery
      2. En Formato de archivo, selecciona Copia de seguridad de Cloud Datastore. Firestore y Datastore comparten el formato de exportación.
    2. En la sección Destino, especifica los siguientes detalles:
      1. En Conjunto de datos, selecciona el conjunto de datos en el que quieras crear la tabla.
      2. En el campo Tabla, introduce el nombre de la tabla que quieras crear.
      3. Verifica que el campo Tipo de tabla sea Tabla nativa.
    3. En la sección Esquema, no es necesario que haga nada. El esquema se infiere para una exportación de Firestore.
    4. Opcional: Especifica la configuración de partición y clúster. Para obtener más información, consulta los artículos sobre cómo crear tablas con particiones y cómo crear y usar tablas agrupadas en clústeres.
    5. Haz clic en Opciones avanzadas y haz lo siguiente:
      • En Write preference (Preferencia de escritura), deja seleccionada la opción Write if empty (Escribir si está vacía). Con esta opción se crea una tabla y se cargan los datos en ella.
      • Si quieres ignorar los valores de una fila que no estén presentes en el esquema de la tabla, selecciona Valores desconocidos.
      • En Encriptado, haz clic en Clave gestionada por el cliente para usar una clave de Cloud Key Management Service. Si dejas el ajuste Google-managed key, BigQuery cifra los datos en reposo.
    6. Haz clic en Crear tabla.

bq

Usa el comando bq load con source_format definido como DATASTORE_BACKUP. Proporcione la marca --location y asigne el valor a su ubicación. Si vas a sobrescribir una tabla, añade la marca --replace.

Para cargar solo campos específicos, usa la marca --projection_fields.

bq --location=LOCATION load \
--source_format=FORMAT \
DATASET.TABLE \
PATH_TO_SOURCE

Haz los cambios siguientes:

  • LOCATION: tu ubicación. La marca --location es opcional.
  • FORMAT: DATASTORE_BACKUP. Datastore Backup es la opción correcta para Firestore. Firestore y Datastore comparten un formato de exportación.
  • DATASET: el conjunto de datos que contiene la tabla en la que vas a cargar los datos.
  • TABLE: la tabla en la que está cargando datos. Si la tabla no existe, se crea.
  • PATH_TO_SOURCE: el URI de Cloud Storage.

Por ejemplo, el siguiente comando carga el archivo de exportación de Firestore gs://mybucket/20180228T1256/default_namespace/kind_Book/default_namespace_kind_Book.export_metadata en una tabla llamada book_data. mybucket y mydataset se crearon en la ubicación multirregional US.

bq --location=US load \
--source_format=DATASTORE_BACKUP \
mydataset.book_data \
gs://mybucket/20180228T1256/default_namespace/kind_Book/default_namespace_kind_Book.export_metadata

API

Define las siguientes propiedades para cargar datos de exportación de Firestore mediante la API.

  1. Crea una load configuración de trabajo que apunte a los datos de origen en Cloud Storage.

  2. Especifica tu ubicación en la propiedad location de la sección jobReference del recurso de empleo.

  3. El sourceUris debe estar completo y tener el formato gs://BUCKET/OBJECT en la configuración de la tarea de carga. El nombre del archivo (objeto) debe terminar en KIND_NAME.export_metadata. Solo se permite un URI para las exportaciones de Firestore y no se puede usar un comodín.

  4. Para especificar el formato de los datos, asigna el valor DATASTORE_BACKUP a la propiedad sourceFormat en la configuración de la tarea de carga. Datastore Backup es la opción correcta para Firestore. Firestore y Datastore comparten un formato de exportación.

  5. Para cargar solo campos específicos, define la propiedad projectionFields.

  6. Si va a sobrescribir una tabla, especifique la disposición de escritura asignando el valor WRITE_TRUNCATE a la propiedad writeDisposition.

Python

Antes de probar este ejemplo, sigue las Pythoninstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Python de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

# TODO(developer): Set table_id to the ID of the table to create.
table_id = "your-project.your_dataset.your_table_name"

# TODO(developer): Set uri to the path of the kind export metadata
uri = (
    "gs://cloud-samples-data/bigquery/us-states"
    "/2021-07-02T16:04:48_70344/all_namespaces/kind_us-states"
    "/all_namespaces_kind_us-states.export_metadata"
)

# TODO(developer): Set projection_fields to a list of document properties
#                  to import. Leave unset or set to `None` for all fields.
projection_fields = ["name", "post_abbr"]

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

job_config = bigquery.LoadJobConfig(
    source_format=bigquery.SourceFormat.DATASTORE_BACKUP,
    projection_fields=projection_fields,
)

load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Waits for the job to complete.

destination_table = client.get_table(table_id)
print("Loaded {} rows.".format(destination_table.num_rows))

Opciones de Firestore

Para cambiar la forma en que BigQuery analiza los datos exportados de Firestore, especifica la siguiente opción:

Opción deGoogle Cloud consola marca `bq` Propiedad de la API de BigQuery Descripción
No disponible --projection_fields projectionFields (Java, Python) (Opcional) Lista separada por comas que indica qué campos del documento se deben cargar de una exportación de Firestore. De forma predeterminada, BigQuery carga todos los campos. En los nombres de los campos se distingue entre mayúsculas y minúsculas, y deben estar presentes en la exportación. No puedes especificar rutas de campo en un campo de mapa, como map.foo.

Conversión de tipo de datos

BigQuery convierte los datos de cada documento de los archivos de exportación de Firestore a tipos de datos de BigQuery. En la siguiente tabla se describe la conversión entre los tipos de datos admitidos.

Tipo de datos de Firestore Tipo de datos de BigQuery
Matriz RECORD
Booleano BOOLEAN
Referencia RECORD
Fecha y hora TIMESTAMP
Mapa RECORD
Número de punto flotante FLOAT
Punto geográfico

RECORD

[{"lat","FLOAT"},
 {"long","FLOAT"}]
        
Entero INTEGER
Cadena STRING (truncado a 64 KB)

Propiedades de clave de Firestore

Cada documento de Firestore tiene una clave única que contiene información como el ID y la ruta del documento. BigQuery crea un tipo de datos RECORD (también conocido como STRUCT) para la clave, con campos anidados para cada información, tal como se describe en la siguiente tabla.

Propiedad clave Descripción Tipo de datos de BigQuery
__key__.app El nombre de la aplicación de Firestore. STRING
__key__.id El ID del documento o null si se ha definido __key__.name. INTEGER
__key__.kind El ID de la colección del documento. STRING
__key__.name El nombre del documento o null si __key__.id está definido. STRING
__key__.namespace Firestore no admite espacios de nombres personalizados. El espacio de nombres predeterminado se representa mediante una cadena vacía. STRING
__key__.path La ruta del documento: la secuencia del documento y los pares de colecciones desde la colección raíz. Por ejemplo: "Country", "USA", "PostalCode", 10011, "Route", 1234. STRING