案例: 我有一个表HiveTest,它是一个ORC表和事务集true并加载到spark shell和查看数据
var rdd= objHiveContext.sql("select * from HiveTest")
rdd.show()
--- 能够查看数据
现在我去了我的蜂巢壳或ambari更新了表格,例如
hive> update HiveTest set name='test' ---Done and success
hive> select * from HiveTest -- able to view updated data
现在,当我可以回到火花并运行时,我无法查看除列名称之外的任何数据
scala>var rdd1= objHiveContext.sql("select * from HiveTest")
scala> rdd1.show()
- 此时只打印列,数据不会出现
问题2:运行时无法从spark sql更新 scal> objHiveContext.sql("更新HiveTest set name =' test'")获得以下错误
org.apache.spark.sql.AnalysisException:
Unsupported language features in query: INSERT INTO HiveTest values(1,'sudhir','Software',1,'IT')
TOK_QUERY 0, 0,17, 0
TOK_FROM 0, -1,17, 0
TOK_VIRTUAL_TABLE 0, -1,17, 0
TOK_VIRTUAL_TABREF 0, -1,-1, 0
TOK_ANONYMOUS 0, -1,-1, 0
TOK_VALUES_TABLE 1, 6,17, 28
TOK_VALUE_ROW 1, 7,17, 28
1 1, 8,8, 28
'sudhir' 1, 10,10, 30
'Software' 1, 12,12, 39
1 1, 14,14, 50
'IT' 1, 16,16, 52
TOK_INSERT 1, 0,-1, 12
TOK_INSERT_INTO 1, 0,4, 12
TOK_TAB 1, 4,4, 12
TOK_TABNAME 1, 4,4, 12
HiveTest 1, 4,4, 12
TOK_SELECT 0, -1,-1, 0
TOK_SELEXPR 0, -1,-1, 0
TOK_ALLCOLREF 0, -1,-1, 0
scala.NotImplementedError: No parse rules for:
TOK_VIRTUAL_TABLE 0, -1,17, 0
TOK_VIRTUAL_TABREF 0, -1,-1, 0
TOK_ANONYMOUS 0, -1,-1, 0
TOK_VALUES_TABLE 1, 6,17, 28
TOK_VALUE_ROW 1, 7,17, 28
1 1, 8,8, 28
'sudhir' 1, 10,10, 30
'Software' 1, 12,12, 39
1 1, 14,14, 50
'IT' 1, 16,16, 52
org.apache.spark.sql.hive.HiveQl$.nodeToRelation(HiveQl.scala:1235)
此错误适用于插入到语句同样的更新语句错误。
答案 0 :(得分:3)
您是否尝试过objHiveContext.refreshTable(“HiveTest”)?
Spark SQL积极缓存Hive Metastore数据。
如果更新发生在Spark SQL之外,您可能会遇到一些意外结果,因为Spark SQL的Hive Metastore版本已过期。
以下是更多信息:
http://spark.apache.org/docs/latest/sql-programming-guide.html#metadata-refreshing
http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.hive.HiveContext
文档主要提到Parquet,但这可能适用于ORC和其他文件格式。
使用JSON,例如,如果将新文件添加到Spark SQL之外的目录中,则需要在Spark SQL中调用hiveContext.refreshTable()以查看新数据。
答案 1 :(得分:0)
sparksql直到现在都没有启用更新和删除事务。但是仍然可以插入。