【发布时间】:2017-09-08 20:54:25
【问题描述】:
我有这种奇怪的行为,我的用例是使用
将 Spark 数据帧写入配置单元分区表sqlContext.sql("INSERT OVERWRITE TABLE <table> PARTITION (<partition column) SELECT * FROM <temp table from dataframe>")
奇怪的是,这在使用主机 A 的 pyspark shell 时有效,但是相同的代码,连接到同一个集群,使用同一个配置单元表在 jupyter 笔记本中不起作用,它返回:
java.lang.NoSuchMethodException: org.apache.hadoop.hive.ql.metadata.Hive.loadDynamicPartitions
在我看来,异常是在启动 pyspark shell 的主机和启动 jupyter 的主机之间存在一些 jar 不匹配,我的问题是,我如何确定在 pyspark shell 中使用了哪个版本的相应 jar ,并通过代码在jupyter笔记本中(我无法访问jupyter服务器)?如果 pyspark shell 和 jupyter 都连接到同一个集群,为什么要使用 2 个不同的版本?
更新:经过一番研究,我发现 jupyter 使用“Livy”,而 Livy 主机使用 hive-exec-2.0.1.jar,我们使用 pyspark shell 的主机使用 hive-exec-1.2 .1000.2.5.3.58-3.jar,所以我从 maven 存储库下载了两个 jar 并对其进行了反编译,我发现两者都存在 loadDynamicPartitions 方法,方法签名(参数)不同,在 livy 版本中 boolean holdDDLTime 参数丢失。
【问题讨论】:
标签: hadoop apache-spark hive pyspark