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()
})
}