【问题标题】:HiveContext.sql() gives runtime No Such Method ErrorHiveContext.sql() 给出运行时没有这样的方法错误
【发布时间】:2017-11-01 22:44:53
【问题描述】:

您好,我正在尝试使用 Apache Hive 和 Apache Spark 运行一个简单的 java 程序。程序编译没有任何错误,但在运行时出现以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.sql.hive.HiveContext.sql(Ljava/lang/String;)Lorg/apache/spark/sql/DataFrame;
at SparkHiveExample.main(SparkHiveExample.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:743)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

以下是我的代码:

 import org.apache.spark.SparkContext;
 import org.apache.spark.SparkConf;
 import org.apache.spark.sql.hive.HiveContext;
 import org.apache.spark.sql.DataFrame;
 public class SparkHiveExample {
 public static void main(String[] args) {
 SparkConf conf = new SparkConf().setAppName("SparkHive Example");
 SparkContext sc = new SparkContext(conf);
 HiveContext hiveContext = new HiveContext(sc);

 System.out.println("Hello World");
 DataFrame df = hiveContext.sql("show tables");
 df.show();
 }
}

我的 pom.xml 文件如下所示:

<project>
  <groupId>edu.berkeley</groupId>
  <artifactId>simple-project</artifactId>
  <modelVersion>4.0.0</modelVersion>
  <name>Simple Project</name>
  <packaging>jar</packaging>
  <version>1.0</version>
  <dependencies>
     <dependency> <!-- Spark dependency -->
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>1.3.0</version>
     </dependency>
     <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_2.10</artifactId>
        <version>1.3.0</version>
     </dependency>
 </dependencies>
</project>

可能是什么问题?

编辑:我尝试使用 SQLContext.sql() 方法,但仍然得到类似的方法未找到运行时错误。 Thisstackoverflow 的回答表明问题是由于依赖问题引起的,但我无法弄清楚是什么。

【问题讨论】:

    标签: java maven hadoop apache-spark hive


    【解决方案1】:

    确保您的 spark 核心和 spark hive 依赖项设置为provided 的范围,如下所示。这些依赖项由集群提供,而不是由您的应用程序提供。

    并确保您的 spark 安装版本为 1.3 或更高版本。在 1.3 之前,sql 方法返回一个 RDD (SchemaRDD) 而不是 DataFrame。很可能安装的 spark 版本早于 1.3。

     <dependency> 
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>1.3.0</version>
        <scope>provided</scope>
     </dependency>
     <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_2.10</artifactId>
        <version>1.3.0</version>
        <scope>provided</scope>
     </dependency>
    

    并且建议您使用SparkSession 对象而不是HiveContext 来运行查询。下面的代码 sn -p 解释了 SparkSession 的使用。

    val spark = SparkSession.builder.
          master("local")
          .appName("spark session example")
          .enableHiveSupport()
          .getOrCreate()
    
    spark.sql("show tables")
    

    【讨论】:

    • 即使添加了范围标签,我也得到了同样的错误。我的 Spark 版本是 2.1.1
    • @AnishKanchan 如果你使用 spark 2.1.1,你应该使用 spark session 对象来运行你的 hive 查询而不是HiveContext。您能试试我在答案中添加的上述 sn-p 吗?
    • 这成功了!谢谢!那么哪个版本的 Spark 支持 HiveContext 呢?此外,使用 SparkSession 时,我看不到配置单元表。你有什么想法吗?
    • SparkSession 是从 Spark 2.0 引入的。 HiveContext 将用于以前的版本。您在创建 sparksession 时是否致电 enableHiveSupport? Hive 表是否应该可见。
    【解决方案2】:

    错误是因为您正在应用显示表的query 并分配给Dataframe

    当您使用select query 或类似查询但不能使用show query 时,您可以分配给DataFrame

    【讨论】:

    • 即使我在那里放一个 SELECT 查询,我也会得到同样的错误
    【解决方案3】:
    from pyspark.sql.types import DecimalType,StringType
    from pyspark.sql.functions import *
    from pyspark.sql import SparkSession
    
    spark = SparkSession.builder.appName("Your APPName").enableHiveSupport().getOrCreate()
    
    from pyspark.sql import HiveContext
    hive_context = HiveContext(spark)
    
    hive_context.sql("select current_date()").show()
    

    【讨论】:

    • 请进一步解释您的答案,为什么以及如何到达这里。仅粘贴代码并不构成正确答案。
    猜你喜欢
    • 2018-05-10
    • 2018-12-14
    • 1970-01-01
    • 2017-10-02
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多