Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在内部提供Hive-site.xml的值,而不是在执行Spark Jar时引用路径_Scala_Apache Spark_Hive_Apache Spark Sql - Fatal编程技术网

Scala 如何在内部提供Hive-site.xml的值,而不是在执行Spark Jar时引用路径

Scala 如何在内部提供Hive-site.xml的值,而不是在执行Spark Jar时引用路径,scala,apache-spark,hive,apache-spark-sql,Scala,Apache Spark,Hive,Apache Spark Sql,我有一段代码将表从Hive提取到spark,工作正常,因此我将Hive-site.xml文件放在eclipse的资源文件夹中 接下来,我将代码转换为jar文件,并引用Hive-site.xml文件的路径来执行程序 我为什么可以在内部(在程序本身中)使用Hive-site.xml的值来覆盖该文件引用部分 代码如下: val appConf = ConfigFactory.load() val conf = new SparkConf(). setAppName("hivedb").setMas

我有一段代码将表从Hive提取到spark,工作正常,因此我将Hive-site.xml文件放在eclipse的资源文件夹中

接下来,我将代码转换为jar文件,并引用Hive-site.xml文件的路径来执行程序

我为什么可以在内部(在程序本身中)使用Hive-site.xml的值来覆盖该文件引用部分

代码如下:

val appConf = ConfigFactory.load()
val conf = new SparkConf().
  setAppName("hivedb").setMaster(appConf.getConfig(args(0)).getString("deploymentMaster"))
val sc = new SparkContext(conf)
val hc = new HiveContext(sc)

val source = hc.sql("SELECT * from sample.source").rdd.map(_.mkString(","))
val destination = hc.sql("select * from sample.destination").rdd.map(_.mkString(","))
Hive-site.xml文件值:

<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true</value>
</property>

 <property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hiveroot</value>   
  </property>

 <property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hivepassword</value>   
  </property>

 <property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive/${user.name}</value>   
  </property>

</configuration>
仅在程序内部使用Hive-site.xml文件的必需值,而无需引用该文件

根据Raktopal Bordoloi的建议

 val warehouseLocation = "/usr/hive/warehouse"
val spark = SparkSession.builder().master("local")
.appName("spark session example")
.config("javax.jdo.option.ConnectionURL","jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true")
  .config("javax.jdo.option.ConnectionUserName","hiveroot")
  .config("javax.jdo.option.ConnectionPassword","hivepassword")
  .config("hive.exec.scratchdir","/tmp/hive/${user.name}")
  .config("spark.sql.warehouse.dir", warehouseLocation)
 // .config("hive.metastore.uris", "thrift://localhost:9083")      
  .enableHiveSupport()
  .getOrCreate()
导入spark.implicits_ 导入spark.sql

sql(“select*from sample.source”).collect.foreach(println)

谢谢大家!

在Spark 2.0中,在创建SparkSession之前,可以在SparkSession的生成器上设置“Spark.sql.warehouse.dir”。它应该在创建配置单元上下文时正确传播

val spark = SparkSession.builder()
.config("spark.sql.warehouse.dir", "...")
.config("hive.metastore.uris", "thrift://localhost:9083")
当模式是远程模式时(在上面的例子中),像“javax.jdo.option.ConnectionURL”这样的配置将不会被使用(因为它们由与数据库对话的远程元存储服务器使用)

对于Spark 1.6,您需要将hive-site.xml放在类路径中。

在Spark 2.0中,您可以在SparkSession的生成器上设置“Spark.sql.warehouse.dir”,然后再创建SparkSession。它应该在创建配置单元上下文时正确传播

val spark = SparkSession.builder()
.config("spark.sql.warehouse.dir", "...")
.config("hive.metastore.uris", "thrift://localhost:9083")
当模式是远程模式时(在上面的例子中),像“javax.jdo.option.ConnectionURL”这样的配置将不会被使用(因为它们由与数据库对话的远程元存储服务器使用)


对于Spark 1.6,您需要将hive-site.xml放在类路径中。

您打算如何从文件中获取数据而不引用它?您打算如何从文件中获取数据而不引用它?谢谢Raktopal Bordoloi,它工作正常,没有任何问题,您再次保存了我:)但它没有在conf.config中使用此值(“hive.metastore.uris”thrift://localhost:9083")实例化“org.apache.spark.sql.hive.HiveSessionState”时抛出一些错误,如error。我有一个问题,请看一看1。现在我在本地主机中运行,因此可以轻松删除它。如果我在远程中有metastore,那么您的HiversServer版本是什么?如果您在hiverser2上运行,您应该将conf设置为
conf.config(“hive.metastore.uris”、“hive2://localhost:9083”)
我试图访问hive2中驻留在远程计算机同一网络中的一个表。在线程“main”java.lang.IllegalArgumentException:实例化“org.apache.spark.sql.hive.HiveSessionState”时出错。我像这样使用了.config(“hive.metastore.uris”,”hive2://remoteservername:9083”)很抱歉提到这一点;hiveserver1或hiveserver2的服务与metastore服务不同。谢谢Raktopal Bordoloi,它工作正常,没有任何问题,您再次保存了我:),但它没有在conf.config(“hive.metastore.uris”)中使用此值thrift://localhost:9083")实例化“org.apache.spark.sql.hive.HiveSessionState”时抛出一些错误,如error。我有一个问题,请看一看1。现在我运行在localhost中,因此可以轻松删除它。如果我在remote中有metastore,那么您的hiverserver版本是什么?如果您在hiverser2上运行,您应该将conf设置为
conf.config(“hive.metastore.uris“,”hive2://localhost:9083“
我试图访问hive2中驻留在远程计算机同一网络中的一个表。在线程“main”java.lang.IllegalArgumentException:实例化“org.apache.spark.sql.hive.HiveSessionState”时出现这些错误异常。我像这样使用了.config(“hive.metastore.uris”,”hive2://remoteservername:9083”)很抱歉,hiveserver1或hiveserver2的服务与metastore服务不同。