如何刷新表并同时执行?

时间:2017-08-22 04:54:44

标签: apache-spark apache-spark-sql spark-streaming

我正在使用Spark Streaming 2.1。我想定期刷新一些缓存表(由spark提供的DataSource,如镶木地板,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除了主线程之外进行刷新工作。

    当我在桌面上调用refresh时Spark会使用缓存表会发生什么?

2 个答案:

答案 0 :(得分:5)

在Spark 2.2.0中,如果通过配置单元或某些外部工具更新了表格的元数据,它们会引入该功能。

您可以使用API​​

来实现它
spark.catalog.refreshTable("my_table")

此API将更新该表的元数据以使其保持一致。

答案 1 :(得分:0)

我在使用SparkSession特别是方法表(即spark.table(table_name))从蜂巢中读取表时遇到问题。每次写完表格并尝试阅读后 我收到此错误:

  

java.IO.FileNotFoundException ...基础文件可能已更新。您可以通过在SQL中运行“ REFRESH TABLE tableName”命令或通过重新创建所涉及的Dataset / DataFrame来显式使Spark中的缓存无效。

我尝试使用spark.catalog.refreshTable(table_name)刷新表,而sqlContext也不起作用。

我的解决方案写在表中,读取后使用:

val usersDF = spark.read.load(s"/path/table_name")

一切正常。

这是问题吗?也许hdfs上的数据尚未更新?