【发布时间】:2017-06-15 15:30:23
【问题描述】:
我有一段代码可以从 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>
我正在寻找类似以下的内容:
val url = "jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true"
val user = "hiveroot"
val password = "hivepassword"
val src ="/tmp/hive/${user.name}"
val a = hc.read.format("jdbc").options(Map("javax.jdo.option.ConnectionURL" -> url,
"user" -> user,
"password" -> password,
"sql" -> "sample.source",
"hive.exec.scratchdir"->src)).load().collect().foreach(println)
只使用程序内部 Hive-site.xml 文件所需的值,无需引用该文件。
根据 Raktotpal 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)
谢谢!
【问题讨论】:
-
您打算如何在不参考文件的情况下从文件中获取数据?
标签: scala apache-spark hive apache-spark-sql