当我尝试运行此代码时,我收到此错误。
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();
}
}
输出:
线程中的异常&#34; main&#34; java.lang.IllegalArgumentException:无法使用Hive支持实例化SparkSession,因为找不到Hive类。 在org.apache.spark.sql.SparkSession $ Builder.enableHiveSupport(SparkSession.scala:778) 在com.training.hivetest.App.main(App.java:21)
如何解决?
答案 0 :(得分:26)
将以下依赖项添加到您的maven项目。
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.0.0</version>
</dependency>
答案 1 :(得分:3)
tl; dr 您必须确保在Spark SQL应用程序的CLASSPATH上的运行时中可以使用Spark SQL的spark-hive
依赖项和所有传递依赖项(不是仅编译所需的构建时间)。
换句话说,您必须在Spark应用程序的CLASSPATH上具有org.apache.spark.sql.hive.HiveSessionStateBuilder
和org.apache.hadoop.hive.conf.HiveConf
类(与sbt或maven无关)。
前HiveSessionStateBuilder
是spark-hive
依赖项(包括所有传递性依赖项)的一部分。
后一个HiveConf
是hive-exec
依赖项的一部分(这是上述spark-hive
依赖项的传递性依赖项)。
答案 2 :(得分:2)
我查看了源代码,发现尽管 HiveSessionState (在spark-hive中),还需要另一个类 HiveConf 来启动SparkSession。并且 HiveConf 不包含在spark-hive * jar中,也许你可以在hive相关的jar中找到它并将它放在你的类路径中。
答案 3 :(得分:2)
我遇到了同样的问题。我可以通过添加以下依赖项来解决它。 (我通过引用compile dependencies section of spark-hive_2.11 mvn repository page)来解析此列表:
this.props.item === {"user_id":1,"stuff":"more stuff"}
其中scala.binary.version = 2.11和spark.version = 2.1.0
<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>
答案 4 :(得分:1)
确保您正在通过spark-submit脚本运行jar:
${SPARK_HOME}/bin/spark-submit <settings> <your-jar-name>
这是一个脚本,可在执行jar之前加载所需的类并提供scala支持。
正如其他人所提到的,请确保您还加载了必需的依赖项。
示例:运行Spark会话
pom.xml
---
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.4.4</version>
<scope>compile</scope>
</dependency>
Test.java
---
SparkSession spark = SparkSession
.builder()
.appName("FeatureExtractor")
.config("spark.master", "local")
.config("spark.sql.hive.convertMetastoreParquet", false)
.config("spark.submit.deployMode", "client")
.config("spark.jars.packages", "org.apache.spark:spark-avro_2.11:2.4.4")
.config("spark.sql.warehouse.dir", "/user/hive/warehouse")
.config("hive.metastore.uris", "thrift://hivemetastore:9083")
.enableHiveSupport()
.getOrCreate();
然后通过Spark执行此代码:
bin/spark-submit \
--class com.TestExample \
--executor-memory 1G \
--total-executor-cores 2 \
test.jar
感谢@ lamber-ken帮我解决了这个问题。
有关更多信息:
Spark Documentation: Submitting Applications
Exception Unable to instantiate SparkSession with Hive support because Hive classes are not found
答案 5 :(得分:0)
我的Spark 2.4.1依赖关系的完整列表在这里
limit_req_zone $http_authorization_key ...
答案 6 :(得分:0)
[更新我的答案]关于StackOverflow的答案正确-answer link。
我还遇到了使用HiveSupport构建和运行Spark的问题。基于以上答案,我在Spark 2.12.8项目中进行了以下操作。
我现在可以毫无问题地运行项目。
libraryDependencies += "junit" % "junit" % "4.12" % Test
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.4.2",
"org.apache.spark" %% "spark-sql" % "2.4.2",
"org.apache.spark" %% "spark-hive" % "2.4.2" % "provided",
"org.scalatest" %% "scalatest" % "3.0.3" % Test
)
答案 7 :(得分:0)
对于 SBT 使用
// https://mvnrepository.com/artifact/org.apache.spark/spark-hive
libraryDependencies += "org.apache.spark" %% "spark-hive" % "2.1.0"
我们使用了 Spark-Core-2.1.0 和 Spark-SQL-2.1.0
答案 8 :(得分:0)
就我而言,我必须检查
包括具有“已提供”范围的依赖项
在我的intellij中的运行/调试配置下