spark-8.sparkcore_5_spark的輸入輸出

spark的輸入輸出

1.文本文件的輸入、輸出

1.sc.textFile(path) 文本文件的輸入。
2.rdd.saveAsTextFile(path) 文本文件的輸出。

2.JSON文件的輸入、輸出

實質上是文本文件的輸入、輸出,需要在程序中手動進行編碼與解碼。

3.CSV\TSV

CSV逗號分割,TSV tab分割,文本文件輸入、輸出。

4.SequenceFile文件輸入、輸出

val sdata = sc.sequenceFile[Int,String](“hdfs://master:9000/sdata/p*”)

對於讀取來說,需要將KV的類型指定一下。
直接調用rdd.saveAsSequenceFile(path)來進行保存。

5.ObjectFile的輸入、輸出

val objrdd:RDD[(Int,String)] = sc.objectFile[(Int,String)](“hdfs://master:9000/objfile/p*”)

對於讀取來說,需要設定KV的類型。
直接調用objrdd.saveAsObjectFile(path)來進行保存。

6.Hadoop輸入、輸出

1.輸入
1)針對舊的hadoop API來說
提供了hadoopFile以及hadoopRDD來進行hadoop的輸入和輸出。
2)針對新的hadoop API來說
提供了newApiHadoopFile以及newApiHadoopRDD來進行hadoop的輸入和輸出。
2.輸出
1)針對舊的hadoop API來說
提供了saveAsHadoopFile 以及saveAsHadoopDataSet來進行hadoop的輸出。
2)針對新的hadoop API來說
提供了saveAsNewApiHadoopFile以及saveAsNewApiHadoopDataSet來進行Hadoop的輸出。
3.寫入:

val data = sc.parallelize(Array((30,"hadoop"),(71,"hive"),(11,"cat")))
data.saveAsNewAPIHadoopFile("hdfs://master:9000/output/",classOf[org.apache.hadoop.io.LongWritable],classOf[org.apache.hadoop.io.Text],classOf[org.apache.hadoop.mapreduce.lib.output.TextOutputFormat[org.apache.hadoop.io.LongWritable,org.apache.hadoop.io.Text]])

4.讀出:

val read = sc.newAPIHadoopFile[LongWritable,Text,org.apache.hadoop.mapreduce.lib.input.TextInputFormat]("hdfs://master:9000/output/part*",classOf[TextInputFormat],classOf[LongWritable],classOf[Text])

7.數據庫的輸入、輸出

1.讀取:通過創建 new JdbcRDD來實現。

JdbcRDD[T: ClassTag](
    sc: SparkContext,	//sparkContext
    getConnection: () => Connection,	//通過方法獲取java.sql.Connection
    sql: String,	//sql查詢語句,需要有主鍵的上下界
    lowerBound: Long,	//主鍵的下界
    upperBound: Long,	//主鍵的上界
    numPartitions: Int,	//分區數
    mapRow: (ResultSet) => T = JdbcRDD.resultSetToObjectArray _)//將ResultSet轉換爲一個結構

如:

def main (args: Array[String] ) {
  val sparkConf = new SparkConf ().setMaster ("local[2]").setAppName ("JdbcApp")
  val sc = new SparkContext (sparkConf)

  val rdd = new org.apache.spark.rdd.JdbcRDD (
    sc,
    () => {
      Class.forName ("com.mysql.jdbc.Driver").newInstance()
      java.sql.DriverManager.getConnection ("jdbc:mysql://master01:3306/rdd", "root", "hive")
    },
    "select * from rddtable where id >= ? and id <= ?;",
    1,
    10,
    1,
    r => (r.getInt(1), r.getString(2)))

  println (rdd.count () )
  rdd.foreach (println (_) )
  sc.stop ()
}

2.寫入

1.沒有提供比較方便的插入數據的方式。
2.一般直接通過JDBC來完成數據的插入。
3.一般使用foreachPartition來批量插入。需要考慮連接池的複用問題應該批量插入,提高效率。

def main(args: Array[String]) {
  val sparkConf = new SparkConf().setMaster("local[2]").setAppName("HBaseApp")
  val sc = new SparkContext(sparkConf)
  val data = sc.parallelize(List("Female", "Male","Female"))

  data.foreachPartition(insertData)
}

def insertData(iterator: Iterator[String]): Unit = {
Class.forName ("com.mysql.jdbc.Driver").newInstance()
  val conn = java.sql.DriverManager.getConnection("jdbc:mysql://master01:3306/rdd", "root", "hive")
  iterator.foreach(data => {
    val ps = conn.prepareStatement("insert into rddtable(name) values (?)")
    ps.setString(1, data) 
    ps.executeUpdate()
  })
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章