apache-spark - 查询 Hive 和转换数据时总是得到 java.io.FileNotFoundException 并需要“REFRESH TABLE tableName”
问题描述
我运行一个预定的过程,它使用 sparkSQL 在 Hive 中查询一个表并进行一些转换,然后计算数据集中的行数:
val dataset = this.query_hive(sql_statement)
val result_interm = this.transformation_step1(dataset)
val result = this.transformation_step2(result_interm)
println(result.count())
我遇到的问题是 Hive 中的表,它更新得相当频繁,每当它在 spark 作业运行时更新时,我都会从 Spark 收到Spark java.io.FileNotFoundException, invalidate the cache in Spark by running REFRESH TABLE table
错误消息。我的问题:有没有办法可以防止这种情况?
解决方案
您可以尝试以下选项:
REFRESH TABLE
在使用一些转换之前运行。- 编写一些
try-finally
代码部分,您将在其中模拟某种重试逻辑。 - 实际上,我无法测试第三个选项,但是您可以尝试创建经常更新的表作为
MANAGED
表,然后创建另一个EXTERNAL
指向该表位置的MANAGED
表,这样它可以读取旧值并且不迷恋java.io.FileNotFoundException
希望这会有所帮助。
推荐阅读
- react-native - React 原生 h.264 编码视频显示
- java - 如何使用 Java 8 的默认方法在接口中使用 EntityManager 实例?
- git - 如何在重新设置其中一个后使两个 git 分支(具有共同历史)彼此连贯?
- django-rest-framework - DRF - 使用 ManyToManyField 将用户添加到模型
- python - 使用opencv python从表单中检测复选框
- python - 对于 bs4 的 .contents,硒中是否有等价物?
- javascript - Firebase setCustomUserClaims 然后
- html - 将flex内的div向右对齐
- ajax - 我对 Reqres api 的发布请求状态始终为 400,并且我收到注册失败响应
- c++ - 无法发送超过 11 个字节的 Esp32