新插入的Hive记录未在Spark Shell的Spark Session中显示

时间:2019-05-24 06:57:19

标签: apache-spark hive

我运行了一个简单的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加载。

2 个答案:

答案 0 :(得分:3)

当首次访问时,Spark从元存储检索表时,它将列出文件并将其缓存在内存中。
当我们执行insert操作时,记录将进入Spark无法识别的 new 文件。两种选择。
 1.触发REFRESH TABLE <tblname>-> spark.sql("REFRESH TABLE firsthivestreamtable")
 2.重新启动Spark应用程序(将再次获取该表及其文件)

答案 1 :(得分:1)

故事的线索是,在Spark中观察到的行为有助于DAG的重新计算-如果需要对工作节点失败进行。

另一个答案解释了力学原理,这个答案是为什么。