2016-09-12 41 views
8

Otrzymuję ten błąd, gdy próbuję uruchomić ten kod.Jak utworzyć SparkSession z obsługą Hive (kończy się niepowodzeniem z "nie znaleziono klas Hive")?

import org.apache.spark.sql.Dataset; 
import org.apache.spark.sql.Row; 
import org.apache.spark.sql.SparkSession; 
public class App 
{ 
    public static void main(String[] args) throws Exception { 
     String warehouseLocation = "file:" + System.getProperty("user.dir") + "spark-warehouse"; 
     SparkSession spark = SparkSession 
      .builder().master("local") 
      .appName("Java Spark Hive Example") 
      .config("spark.sql.warehouse.dir", warehouseLocation).enableHiveSupport() 
      .getOrCreate(); 

     String path = "/home/cloudera/Downloads/NetBeansProjects/sparksql1/src/test/Employee.json"; 

     spark.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)"); 
     spark.sql("LOAD DATA LOCAL INPATH '"+path+"' INTO TABLE src"); 



     //load from HDFS 

     Dataset<Row> df = spark.read().json(path); 

     df.registerTempTable("temp_table"); 

     spark.sql("create table TEST.employee as select * from temp_table"); 

     df.printSchema(); 
     df.show(); 

     } 
} 

wyjściowa:

Wyjątek w wątku "głównym" java.lang.IllegalArgumentException: Nie można utworzyć wystąpienia SparkSession z Hive wsparcia, ponieważ zajęcia Hive nie występują. na org.apache.spark.sql.SparkSession $ Builder.enableHiveSupport (SparkSession.scala: 778) w com.training.hivetest.App.main (App.java:21)

Jak to może być zdecydowany?

Odpowiedz

13

Dodaj następującą zależność do swojego projektu maven.

<dependency> 
     <groupId>org.apache.spark</groupId> 
     <artifactId>spark-hive_2.11</artifactId> 
     <version>2.0.0</version> 
</dependency> 
+0

mam zapłonie hive_2.11-2.0.1 .jar, ale nadal dostaję błąd (po prostu ręcznie dodałem słoik do ścieżki klasy - nie dodałem zależności do Mavena) –

+0

@ Sam-T Czy jesteś w stanie zaimportować "org.apache.spark.sql.hive. *; " w twojej klasie java? Czy próbowałeś dodać go do maven, a następnie zaktualizować projekt maven? – abaghel

1

szukałem do kodu źródłowego, a okazało się, że mimo HiveSessionState (w zapłonie ula), inna klasa HiveConf konieczna jest również zainicjować SparkSession. I HiveConf nie jest zawarty w słoiku *, może znajdziesz go w słoikach związanych z ulem i umieścisz go w swojej ścieżce klasowej.

1

Miałem ten sam problem. Mogłem go rozwiązać, dodając następujące zależności. (I rozwiązany do tej listy odwołując compile dependencies section of spark-hive_2.11 mvn repository page):

<dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-hive_${scala.binary.version}</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.calcite</groupId> 
      <artifactId>calcite-avatica</artifactId> 
      <version>1.6.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.calcite</groupId> 
      <artifactId>calcite-core</artifactId> 
      <version>1.12.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.spark-project.hive</groupId> 
      <artifactId>hive-exec</artifactId> 
      <version>1.2.1.spark2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.spark-project.hive</groupId> 
      <artifactId>hive-metastore</artifactId> 
      <version>1.2.1.spark2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.13</version> 
     </dependency> 

gdzie scala.binary.version = 2,11 i spark.version = 2.1.0

<properties> 
     <scala.binary.version>2.11</scala.binary.version> 
     <spark.version>2.1.0</spark.version> 
    </properties>