Spark2 中的 SQLContext 没有获取更新的配置单元表记录

Posted

技术标签:

【中文标题】Spark2 中的 SQLContext 没有获取更新的配置单元表记录【英文标题】:SQLContext in Spark2 not getting updated hive table records 【发布时间】:2019-01-16 05:23:18 【问题描述】:

我有一个正在运行的应用程序,它使用 HiveContext 查询配置单元表,如果我在 spark1.6 中使用 spark-submit 运行应用程序,它工作正常。作为升级的一部分,我们切换到 spark2.1 并使用 spark2-submit。由于 spark2 不支持 HiveContext,因此我使用 SQLContext 代替。我面临的问题是,一旦我启动上下文,配置单元表中的任何增量更改在配置单元查询结果中都不可见。我正在使用 enableHiveSupport() 启动 SparkContext。如果我停止并重新启动应用程序,我可以看到这些行。写入数据的应用程序在写入后正在执行 MSCK REPAIR TABLE,所以我不确定我缺少什么。

这是代码sn-p

val spark= SparkSession.builder().enableHiveSupport().getOrCreate()
val sqlc=spark.sqlContext
sqlc.sql("select * from table1").show(false)

+---+----------+----+
| id|   hire_dt|user|
+---+----------+----+
|1.0|2018-01-01|John|
|2.0|2018-12-01|Adam|
+---+----------+----+

现在在另一个会话中,我添加了新行,但如果我运行上面的代码,它仍然只返回 2 行。

如果我做一个刷新表,这很好用,即

val spark= SparkSession.builder().enableHiveSupport().getOrCreate()
val sqlc=spark.sqlContext
sqlc.sql("refresh table table1")
sqlc.sql("select * from table1").show(false)

我的问题是为什么我应该做一个 refeshTable,因为我从来没有在 spark1.6 中做过,当我使用 HiveContext 进行查询时,SQLContext 的行为方式应该与 HiveContext 相同

【问题讨论】:

【参考方案1】:

试试 sqlContext.refreshTable("my_table")

在火花 2.x 中spark.catalog.refreshTable("my_table")

SQL 格式spark.sql("refresh table my_table")

【讨论】:

谢谢,但我有 40 tBles 刷新每个之前的查询是开销。为什么在没有它的情况下在 hivecontext 中需要它

以上是关于Spark2 中的 SQLContext 没有获取更新的配置单元表记录的主要内容,如果未能解决你的问题,请参考以下文章

在 spark 2.1 中访问共享的 SqlContext

Spark 2.0:绝对 URI 中的相对路径(spark-warehouse)

Spark2.x AFTSurvivalRegression算法

用于 Cassandra 的 Spark2 会话,sql 查询

Spark(23)——Spark1.X和Spark2.X的区别

spark提交异常日志分析