私はSpark Streaming 2.1を使用しています。キャッシュされたテーブルをリフレッシュしたいのですが(spark parquet、MySQL、またはユーザー定義データなどの提供されたDataSourceによってロードされますソース)定期的に。
テーブルを更新するには?
によって読み込まれたいくつかのテーブルがあるとします
spark.read.format("").load().createTempView("my_table")
そしてそれはまたによってキャッシュされます
spark.sql("cache table my_table")
次のコードでテーブルを更新するのに十分であり、テーブルが次にロードされると、自動的にキャッシュされます
spark.sql("refresh table my_table")
または私はそれを手動で行う必要がありますか
spark.table("my_table").unpersist spark.read.format("").load().createOrReplaceTempView("my_table") spark.sql("cache table my_table")
テーブルを同時に更新しても安全ですか?
同時実行とは、ScheduledThreadPoolExecutor
を使用してメインスレッドとは別に更新作業を行うことを意味します。
テーブルで更新を呼び出すときに、Sparkがキャッシュされたテーブルを使用している場合はどうなりますか?
Spark 2.2.0では、テーブルがHiveまたは一部の外部ツールによって更新された場合に、テーブルのメタデータを更新する機能が導入されました。
APIを使用してそれを実現できます。
spark.catalog.refreshTable("my_table")
このAPIは、テーブルのメタデータを更新して、一貫性を保ちます。
SparkSession、具体的にはメソッドテーブル、つまりspark.table(table_name)
を使用してHiveからテーブルを読み取るときに問題が発生しました。テーブルを書き込んだ後、毎回私がこのエラーを得たことを読んでみてください:
Java.IO.FileNotFoundException ...基礎となるファイルが更新された可能性があります。SQLで 'REFRESH TABLE tableName'コマンドを実行するか、再作成することにより、Sparkでキャッシュを明示的に無効にできます関連するデータセット/データフレーム。
spark.catalog.refreshTable(table_name)
を使用してテーブルを更新しようとしましたが、sqlContextも機能しませんでした。
表を書いて読んだ後の私の解決策:
val usersDF = spark.read.load(s"/path/table_name")
それはうまくいきます。
これは問題ですか?多分hdfsのデータはまだ更新されていませんか?