spark:自定義分割槽,自定義排序,spark與jdbc,廣播變數等
//自定義分割槽 import org.apache.spark.SparkConf import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.Partitioner object PrimitivePartitionTest { def main(args: Array[String]): Unit = { val conf = new SparkConf conf.setMaster("local[2]").setAppName("Partitioner") val context = new SparkContext(conf) val rdd = context.parallelize(List(("hgs",2),("wd",44),("cm",99),("zz",100),("xzhh",67)), 2) //例項化類,並設定分割槽類 val partitioner = new CustomPartitioner(2) val rdd1 = rdd.partitionBy(partitioner) rdd1.saveAsTextFile("c:\\partitioner") context.stop() } } //自定義分割槽類繼承spark的Partitioner class CustomPartitioner(val partitions:Int ) extends Partitioner{ def numPartitions: Int= this.partitions def getPartition(key: Any): Int={ if(key.toString().length()<=2) 0 else 1 } }
//自定義排序 package hgs.spark.othertest import org.apache.spark.SparkConf import org.apache.spark.SparkContext import scala.math.Ordered //自定義排序第一種實現方式,透過繼承ordered class Student(val name:String,var age:Int) extends Ordered[Student] with Serializable{ def compare(that: Student): Int={ return this.age-that.age } } class Boy(val name:String,var age:Int) extends Serializable{ } //第二種方式透過實現隱式轉換實現 object MyPredef{ implicit def toOrderBoy = new Ordering[Boy]{ def compare(x: Boy, y: Boy): Int={ x.age - y.age } } } //引入隱式轉換 import MyPredef._ object CutstomOrder { def main(args: Array[String]): Unit = { val conf = new SparkConf() conf.setMaster("local[2]").setAppName("CutstomOrder") val context = new SparkContext(conf) val rdd = context.parallelize(List(("hgs",2),("wd",44),("cm",99),("zz",100),("xzhh",67)), 2) //下面的第二個引數false為降序排列 //val rdd_sorted = rdd.sortBy(f=>new Student(f._1,f._2), false, 1) val rdd_sorted = rdd.sortBy(f=>new Boy(f._1,f._2), false, 1) rdd_sorted.saveAsTextFile("d:\\ordered") context.stop() } }
//JDBC import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.rdd.JdbcRDD import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet import scala.collection.mutable.ListBuffer object DataFromJdbcToSpark { def main(args: Array[String]): Unit = { val conf = new SparkConf() conf.setMaster("local[2]").setAppName("BroadCastTest") val context = new SparkContext(conf) val sql = "select name,age from test where id>=? and id <=?" var list = new ListBuffer[(String,Int)]() //第七個引數是一個自定義的函式,spark會呼叫該函式,完成自定義的邏輯,y的資料型別是ResultSet,該函式不可以想自己定義的陣列新增資料, //應為應用的函式會將結果儲存在JdbcRDD中 val jdbcRDD = new JdbcRDD(context,getConnection,sql,1,8,2,y=>{ (y.getString(1),y.getInt(2)) }) println(jdbcRDD.collect().toBuffer) context.stop() } def getConnection():Connection={ Class.forName("com.mysql.jdbc.Driver") val conn = DriverManager.getConnection("jdbc:mysql://192.168.6.133:3306/hgs","root","123456"); conn } } //---------------------------------------------------------------------- package hgs.spark.othertest import java.sql.Connection import java.sql.DriverManager import org.apache.commons.dbutils.QueryRunner import org.apache.spark.SparkConf import org.apache.spark.SparkContext //將spark計算後的結果錄入資料庫 object DataFromSparktoJdbc { def main(args: Array[String]): Unit = { val conf = new SparkConf conf.setMaster("local[2]").setAppName("DataFromSparktoJdbc") val context = new SparkContext(conf) val addressrdd= context.textFile("d:\\words") val words = addressrdd.flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+_) //println(words.partitions.size) var p:Int =0 words.foreachPartition(iter=>{ //每個分割槽一個連結 val qr = new QueryRunner() val conn = getConnection println(conn) val sql = s"insert into words values(?,?)" //可以修改為批次插入效率更高 while(iter.hasNext){ val tpm = iter.next() val obj1 :Object = tpm._1 val obj2 :Object = new Integer(tpm._2) //obj1+conn.toString()可以看到資料庫的插入資料作用有三個不同的連結 qr.update(conn, sql,obj1+conn.toString(),obj2) } //println(conn) //println(p) conn.close() }) words.saveAsTextFile("d:\\wordresult") } def getConnection():Connection={ Class.forName("com.mysql.jdbc.Driver") val conn = DriverManager.getConnection("jdbc:mysql://192.168.6.133:3306/hgs","root","123456"); conn } }
//廣播變數 package hgs.spark.othertest import org.apache.spark.SparkConf import org.apache.spark.SparkContext object BroadCastTest{ def main(args: Array[String]): Unit = { val conf = new SparkConf() conf.setMaster("local[2]").setAppName("BroadCastTest") val context = new SparkContext(conf) val addressrdd= context.textFile("d:\\address") val splitaddrdd = addressrdd.map(x=>{ val cs = x.split(",") (cs(0),cs(1)) }).collect().toMap //廣播變數,資料被快取在每個節點,減少了節點之間的資料傳送,可以有效的增加效率,廣播出去的可以是任意的資料型別 val maprdd = context.broadcast(splitaddrdd) val namerdd = context.textFile("d:\\name") val result = namerdd.map(x=>{ //該出使用了廣播的出去的陣列 maprdd.value.getOrElse(x, "UnKnown") }) println(result.collect().toBuffer) context.stop() } }
其他一些知識點 1.spark 廣播變數 rdd.brodcastz(rdd),廣播變數的用處是將資料匯聚傳輸到各個excutor上面 ,這樣在做資料處理的時候減少了資料的傳輸 2.wordcount程式 context.textFile(args(0),1).flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_) wordcount程式程式碼,一個wordcount會產生5個RDD sc.textFile() 會產生兩個RDD 1.HadoopRDD-> MapPartitionsRDD flatMap() 會產生MapPartitionsRDD map 會產生MapPartitionsRDD reduceByKey 產生ShuuledRDD saveAsTextFile 3.快取資料到記憶體 rdd.cache 清理快取 rdd.unpersist(true),rdd.persist儲存及級別 cache方法呼叫的是persist方法 4.spark 遠端debug,需要設定sparkcontext.setMaster("spark://xx.xx.xx.xx:7077").setJar("d:/jars/xx.jar")
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2216316/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kafka - 自定義分割槽器Kafka
- hadoop mapreducez自定義分割槽Hadoop
- spark的計算器與廣播變數Spark變數
- MapReduce之自定義分割槽器Partitioner
- 【大資料開發】SparkCore——利用廣播變數優化ip地址統計、Spark2.x自定義累加器大資料Spark變數優化
- Spark RDD的預設分割槽數:(spark 2.1.0)Spark
- Spark學習——分割槽Partition數Spark
- Python自定義排序Python排序
- MySQL自定義排序MySql排序
- Spark輸出自定義檔案目錄踩坑(Java)SparkJava
- Nginx 如何自定義變數?Nginx變數
- CSS 自定義屬性(變數)CSS變數
- 自定義view————Banner輪播View
- spark2.4.3 sparkSQL 使用者自定義函式筆記SparkSQL函式筆記
- Hive和Spark分割槽策略HiveSpark
- Spark操作Hive分割槽表SparkHive
- Flink SQL FileSystem Connector 分割槽提交與自定義小檔案合併策略 SQL
- android自定義view(自定義數字鍵盤)AndroidView
- 使用 CSS 自定義屬性(變數)CSS變數
- mysql中自定義變數有哪些MySql變數
- Java 列表元素自定義排序Java排序
- js:陣列自定義排序JS陣列排序
- Java 對映 自定義排序Java排序
- Spark SQL使用簡介(2)--UDF(使用者自定義函式)SparkSQL函式
- uniapp自定義卡片輪播圖APP
- Apache Linkis自定義變數實踐分享Apache變數
- Hadoop自定義輸出排序方式Hadoop排序
- 1122. 陣列的相對排序(計數排序 / 自定義排序)陣列排序
- Android8 自定義廣播接收不到的問題Android
- carousel 輪播自定義進度條
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- Apache Spark:分割槽和分桶 - NiveditaApacheSpark
- CSS變數(自定義屬性)實踐指南CSS變數
- JAVA Comparator 自定義排序 原始碼分析Java排序原始碼
- mysql自定義排序順序語句MySql排序
- spark RDD textFile運算元 分割槽數量詳解Spark
- Spark獲取當前分割槽的partitionIdSpark
- CSS Var 自定義屬性中使用 Scss 變數CSS變數