1

案例:我有一个表 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

现在,当我可以返回 spark 并运行时,我无法查看除列名之外的任何数据

scala>var rdd1= objHiveContext.sql("select * from HiveTest")
scala> rdd1.show()

--这次只打印列,数据不来

问题 2:当我运行 scal>objHiveContext.sql("update HiveTest set name='test'") 时无法从 spark sql 更新得到以下错误

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)

此错误适用于 Insert into 语句,也适用于更新语句。

4

2 回答 2

4

您是否尝试过 objHiveContext.refreshTable("HiveTest")?

Spark SQL 积极缓存 Hive 元存储数据。

如果更新发生在 Spark SQL 之外,您可能会遇到一些意外结果,因为 Spark SQL 的 Hive 元存储版本已过期。

这里有更多信息:

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() 以查看新数据。

于 2016-01-08T23:50:30.690 回答
0

sparksql 到目前为止还没有启用更新和删除事务。但是插入仍然可以完成。

于 2018-10-11T10:51:44.777 回答