我运行了一个简单的Spark-sql程序,以使用spark-SQL从Hive到Spark会话获取数据。
scala> spark.sql("select count(1) from firsthivestreamtable").show(100,false)
+--------+
|count(1)|
+--------+
|36 |
+--------+
Ran插入语句可在Hive表中(直接在Hive控制台上)插入9条新记录。验证Hive表中是否已正确插入其他行。
hive> select count(1) aa from firsthivestreamtable;
Total MapReduce CPU Time Spent: 4 seconds 520 msec
OK
45
Time taken: 22.173 seconds, Fetched: 1 row(s)
hive>
但是已经打开的spark会话不会显示新插入的9行。因此,当我在spark会话中进行计数时,它仍然显示36行。为什么会这样呢?
scala> spark.sql("select count(1) from firsthivestreamtable").show(100,false)
+--------+
|count(1)|
+--------+
|36 |
+--------+
在Spark会话中为将刷新后的(新)数据获取到会话中,应该做什么?由于已插入新数据,因此Hive表中的实际行数现在为45,而不是36。
它在spark外壳中,并且Hive中的表正在通过Spark结构化的流API加载。
答案 0 :(得分:3)
当首次访问时,Spark从元存储检索表时,它将列出文件并将其缓存在内存中。
当我们执行insert
操作时,记录将进入Spark无法识别的 new 文件。两种选择。
1.触发REFRESH TABLE <tblname>
-> spark.sql("REFRESH TABLE firsthivestreamtable")
。
2.重新启动Spark应用程序(将再次获取该表及其文件)
答案 1 :(得分:1)
故事的线索是,在Spark中观察到的行为有助于DAG的重新计算-如果需要对工作节点失败进行。
另一个答案解释了力学原理,这个答案是为什么。