- DataFrame寫入hive API:
- registerTempTable函數是創建spark臨時表
- insertInto函數是向表中寫入數據,可以看出此函數不能指定數據庫和分區等信息,不可以直接進行寫入。
- 向hive數據倉庫寫入數據必須指定數據庫,hive數據表建立可以在hive上建立,或者使用hiveContext.sql(“create table ....")
case class Person(name:String,col1:Int,col2:String) def main(args:Array[String]){ val sc = new org.apache.spark.SparkContext val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc) import hiveContext.implicits._ hiveContext.sql("use DataBaseName") val data = sc.textFile("path").map(x=>x.split("\\s+")).map(x=>Person(x(0),x(1).toInt,x(2))) data.toDF()insertInto("tableName") }
將DataFrame數據寫入hive指定數據表的分區中
- hive數據表建立可以在hive上建立,或者使用hiveContext.sql(“create table ....")
- 使用saveAsTable時數據存儲格式有限,默認格式為parquet,可以指定為json,如果有其他格式指定,盡量使用語句來建立hive表。
將數據寫入分區表的思路是:首先將DataFrame數據寫入臨時表,之后是由hiveContext.sql語句將數據寫入hive分區表中。具體操作如下:
case class Person(name:String,col1:Int,col2:String) def main(args:Array[String]):Unit={ val sc = new org.apache.spark.SparkContext val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc) import hiveContext.implicits._ hiveContext.sql("use DataBaseName") val data = sc.textFile("path").map(x=>x.split("\\s+")).map(x=>Person(x(0),x(1).toInt,x(2))) data.toDF().registerTempTable("table1") hiveContext.sql("insert into table2 partition(date='2015-04-02') select name,col1,col2 from table1") }
聲明本文轉自:http://www.aboutyun.com/thread-12392-1-1.html