我正在使用Spark Streaming 2.1。我想定期刷新一些缓存表(由spark提供的DataSource,如镶木地板,MySQL或用户定义的数据源)。
如何刷新表格?
假设我有一些由
加载的表 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
除了主线程之外进行刷新工作。
当我在桌面上调用refresh时Spark会使用缓存表会发生什么?
答案 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上的数据尚未更新?