我在程序中使用了Maven依赖项hive-hcatalog-core
并且这个jar存在于项目maven依赖项中,带有接口(如上图所示)。
接口ICacheableMetaStoreClient尽管提供了该类,但无法从导入org.apache.hive.hcatalog.common解析。 (图片-底部)
因此,在执行火花提交时,我遇到了异常:
com.google.common.util.concurrent.UncheckedExecutionException:
java.lang.IllegalArgumentException:接口
org.apache.hive.hcatalog.common.HiveClientCache $ ICacheableMetaStoreClient
在类加载器中不可见
我需要怎么做才能从程序类路径中看到它。
最佳答案
让我们看一下代码:
class HiveClientCache {..}
HiveClientCache
仅具有程序包级别的可见性,它与ICacheableMetaStoreClientwont
一起将无法在该程序包外部导入(这包括在您的代码中)。现在让我们看一下
ICacheableMetaStoreClient
:@InterfaceAudience.Private
public interface ICacheableMetaStoreClient extends IMetaStoreClient {....}
该接口是公共的,但是具有注释,这使Hive / Hadoop进行了额外的预处理以检查对象类型并引发IllegalArgumentException。
这是
InterfaceAudience
的JavaDoc:通知用户有关包,类或方法的预期用途的注释
听众。目前,目标对象可以是InterfaceAudience.Public,
InterfaceAudience.LimitedPrivate或InterfaceAudience.Private。所有
公共类必须具有InterfaceAudience批注。
默认情况下,未使用此批注标记的公共类必须视为InterfaceAudience.Private。
外部应用程序只能使用标记为InterfaceAudience.Public的类。避免使用非公共类,因为这些
可以以不兼容的方式删除或更改类。
Hadoop项目只能使用标记为InterfaceAudience.LimitedPrivate或InterfaceAudience.Public的类
方法可能具有不同的注释,与类的受众分类相比,注释的限制性更强。示例:一个类
可能是InterfaceAudience.Public,但是方法可能是
InterfaceAudience.LimitedPrivate