我有一个奇怪的行为,我的用例是使用
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和jupyter笔记本中使用的是哪个版本的对应jar(我无法访问jupyter服务器)?如果pyspark shell和jupyter都连接到同一个集群,为什么会使用两个不同的版本呢?
更新:经过一番研究,我发现jupyter使用的是“livy”,livy host使用的是hive-exec-2.0.1.jar,我们使用pyspark shell的主机使用的是hive-exec-1.2.1000.2.5.3.58-3.jar,所以我从maven repository下载了这两个jar并反编译了它们,我发现虽然两个jar中都存在loaddynamicpartitions方法,但方法签名(参数)不同,在livy版本中,缺少boolean holddltime参数。
1条答案
按热度按时间weylhg0b1#
我在尝试从cloudera获取maven依赖项时遇到了类似的问题