J'utilise Spark Streaming 2.1. Je voudrais rafraîchir une table mise en cache (chargée par spark fournie DataSource comme parquet, MySQL ou données définies par l'utilisateur) sources) périodiquement.
comment rafraîchir la table?
Supposons que j'ai une table chargée par
spark.read.format("").load().createTempView("my_table")
et il est également mis en cache par
spark.sql("cache table my_table")
est-ce suffisant avec le code suivant pour actualiser la table, et lorsque la table sera chargée ensuite, elle sera automatiquement mise en cache
spark.sql("refresh table my_table")
ou dois-je le faire manuellement avec
spark.table("my_table").unpersist spark.read.format("").load().createOrReplaceTempView("my_table") spark.sql("cache table my_table")
est-il sûr de rafraîchir la table simultanément?
Par simultané, j'entends utiliser ScheduledThreadPoolExecutor
pour effectuer le travail de rafraîchissement en dehors du thread principal.
Que se passera-t-il si le Spark utilise la table mise en cache lorsque j'appelle Actualiser sur la table?
Dans Spark 2.2.0, ils ont introduit la fonctionnalité d'actualisation des métadonnées d'une table si elle était mise à jour par Hive ou certains outils externes.
Vous pouvez y parvenir en utilisant l'API,
spark.catalog.refreshTable("my_table")
Cette API mettra à jour les métadonnées de cette table pour qu'elle reste cohérente.
J'ai eu un problème pour lire une table de Hive en utilisant une SparkSession spécifiquement la table de méthode, c'est-à-dire spark.table(table_name)
. Chaque fois après avoir écrit le tableau et essayez de lire que j'ai eu cette erreur:
Java.IO.FileNotFoundException ... Les fichiers sous-jacents peuvent avoir été mis à jour. Vous pouvez explicitement invalider le cache dans Spark en exécutant la commande 'REFRESH TABLE tableName' dans SQL ou en recréant l'ensemble de données/DataFrame impliqué.
J'ai essayé de rafraîchir la table en utilisant spark.catalog.refreshTable(table_name)
également sqlContext ni travaillé.
Mes solutions comme écrit le tableau et après avoir lu en utilisant:
val usersDF = spark.read.load(s"/path/table_name")
Ça marche bien.
Est-ce un problème? Peut-être que les données de hdfs ne sont pas encore mises à jour?