2017-08-22 81 views
1

我正在使用Spark Streaming 2.1。我想定期刷新一些緩存表(由spark提供的DataSource加載,如parquet,MySQL或用戶定義的數據源)。如何刷新表並同時執行?

  1. 如何刷新表格?

    假設我有一些表格由

    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")

  2. 做手工是安全的刷新表併發?

    併發我的意思是使用ScheduledThreadPoolExecutor來做除主線程之外的刷新工作。

    如果Spark在桌面上調用刷新時使用緩存表會發生什麼情況?

回答

1

在Spark 2.2.0中,他們引入了刷新表的元數據的功能,如果它是由配置單元或某些外部工具更新的。

您可以通過使用API​​實現它,

spark.catalog.refreshTable("my_table") 

這個API將更新元數據爲表保持一致。

+0

API Spark.catalog.refreshTable存在於Spark 2.2.0之前,我想它和spark.sql(「refresh table ...」)是一樣的。你的意思是說,在Spark 2.2.0之前通過使用'spark.catalog.refreshTable'是不夠的,我必須手動unpersist和recache?併發性又如何?使用spark.catalog.refreshTable的 –

+0

應該足夠了。你的意思是併發!如果你的意思是並行化,那麼就我所知,它並不會損害並行化。 – Ganesh

+0

我需要解釋更多,我的英語很差。你回答和你的評論是不一致的。在您的回答中,您指出該功能是在Spark 2.2.0中引入的。在你的評論中,你甚至會說即使使用Spark 2.1.0'spark.catalog.refreshTable'就足夠了。它讓我非常困惑。通過併發性,我有一個例子。當Spark執行一些正在使用某個緩存表t1的物理計劃時,我同時調用refresh t1,Spark會做什麼?等到物理計劃完成,然後刷新表格。或者在實際使用計劃中的表之前重新加載表格? –

相關問題