我正在使用Spark 1.4。 HiveContext用于连接Hive。我做了以下
val hx = new HiveContext(sc)
import hx.implicits._
hx.sql("select * from tab").show
//没关系,结果显示为预期
然后,我从 beeline console
中将一些记录插入到标签中hx.refreshTable("tab")
hx.sql("select * from tab").show
//仍然是旧记录,没有新插入的记录
我的问题是:为什么HiveContext没有检索新插入的记录?
答案 0 :(得分:2)
hiveContext。 refreshTable (tableName:String) - 此将仅刷新表格的元数据(不是实际数据)
官方文件中的注释:(信用:https://spark.apache.org)
refreshTable(tableName:String):单位
使所有缓存的给定表的元数据无效并刷新。出于性能原因,Spark SQL或其使用的外部数据源库可能会缓存有关表的某些元数据,例如块的位置。当这些更改在Spark SQL之外时,用户应调用此函数使缓存无效
要检索新插入的记录: - 首先使用 uncacheTable(String tableName)和 cacheTable(String tableName) <,然后再次缓存/ p>
答案 1 :(得分:0)
如果目标表已分区,则需要插入&#39;分区&#39;选项。如果您错过了分区,数据将不可见。
angular.module('cardList', []).controller('CardController', function($scope, $http) {
$http.get("Controllers/CardController/AllCardsList").then(function(response){
$scope.names = response.data;
});
});
答案 2 :(得分:-1)
在一个不同的情况下,我通过RDD
来自Spark SQL语句HiveContext
。经过一些实验后,对我有用的解决方案是实际重新生成RDD
本身。
无论您是使用Spark SQL的DDL还是直接通过hiveContext.sql
发送SQL语句,都无关紧要。
我已经看到人们使用“计数技巧”来强制重新计算数据集,但至少在我的尝试中我无法以这种方式看到新数据。
无论如何尝试缓存,刷新和朋友对我不起作用,如果有人在这里有一些正确的模式请分享。