J'ai une collection de données
dans Google cloud Firestore. Cette collection contient plus de 200 000 documents. Je veux exporter chaque document sous forme de ligne vers un fichier.
J'ai créé un script qui fonctionne bien pour 50K lignes. Après cela, son crash avec l'exception suivante. Comment puis-je obtenir tous les documents?
J'ai vu quelque chose appelé offset, mais je ne suis pas sûr que cela aide dans ma situation.
Extrait de code:
The above exception was the direct cause of the following exception: Traceback (most recent call last): File "down_db.py", line 13, in <module> for doc in docs: File "/usr/local/lib/python3.6/dist-packages/google/cloud/firestore_v1beta1/query.py", line 744, in get for index, response_pb in enumerate(response_iterator): File "/usr/local/lib/python3.6/dist-packages/google/api_core/grpc_helpers.py", line 81, in next six.raise_from(exceptions.from_grpc_error(exc), exc) File "<string>", line 3, in raise_from google.api_core.exceptions.ServiceUnavailable: 503 The datastore operation timed out, or the data was temporarily unavailable.
3 Réponses :
J'ai créé un script qui fonctionne bien pour 50 000 lignes.
Cette limite correspond précisément au nombre de documents que vous pouvez lire sur un projet sur le plan gratuit / Spark de Firebase. Si votre projet est sur le plan gratuit, vous devrez le mettre à jour pour lire plus de documents par jour.
Merci @Frank van Puffelen. J'utilise le projet cloud Firestore de Google. Qui a des crédits de 300 $ et je suppose que les limites de ligne ne s'appliquent pas aux projets GCP.
Le client python Cloud Firestore dispose d'un délai de 20 secondes pour get ()
. Essayez de diviser le travail ou essayez de récupérer toutes les références de document, puis d'itérer.
docs = [snapshot.reference for snapshot in col.get()] for doc in docs: ...
Il existe une autre approche qui, je pense, fonctionnerait avec l'outil de ligne de commande gcloud, cela vous obligera à utiliser le stockage Bucket et BigQuery, les deux sont assez faciles à mettre en œuvre.
gcloud beta firestore export gs://[BUCKET_NAME] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2]
Toutes vos collections seront exportées vers un bucket GCS, le format de données est le même que celui de Cloud Datastore, il est lisible via BigQuery donc ..
Chargez les données du GCS Bucket vers Bigquery a>, la collection Firestore exportée vivra sous forme de tableau dans BigQuery
Interrogez le formulaire de table BigQuery avec quelque chose comme select * from [TABLE_NAME]
, BigQuery a alors une option pour télécharger le résultat de la requête au format CSV
Que diriez-vous de charger des données par petits morceaux?
Je n'insère pas de données dans Firestore, mais je les télécharge. Je n'ai aucun contrôle sur la limitation des données ou les clauses where.
C'est aussi ce dont je parle, télécharger des données par petits morceaux. Oh, tu as. Vérifiez ceci .
Merci @AlexMamo, je vais essayer ça. J'essaierai plus tard les curseurs de requête
Copie possible de Pourquoi tous mes documents ne sont-ils pas mis à jour dans Firestore? a>