spark 常用操作

該文章記錄使用的spark的基本操作

import breeze.numerics.pow
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object template {
  def kismet(): Unit = {
    val spark = SparkSession.builder()
      .appName("just kismet")
      .enableHiveSupport()
      .getOrCreate()
    val udata = spark.sql("select * from udata")
    // =========================類型轉換,和創建===========================
    // rdd轉dataFrame需要引入
    import spark.implicits._
    // 轉成rdd時數據都處理成String,這樣在處理時可以直接轉換(toDouble,toInt)
    udata.rdd.map(x => (x(0).toString, x(2).toString)).map(x => x._1.toDouble)
	// 根據類的類型創建dataFrame,其中rdd爲RDD[orders]類型
	val oFreame = spark.creatDataFrame(udata.rdd,classOf[Orders])
	// dataFrame轉dataSet
	import org.opache.spark.sql.Encoders.kryo
	implicit val encoder = kryo[Orders]
	val oSet = udata.as[Orders]
	// =======================udf================================
    // 使用udf時要引入
    import org.apache.spark.sql.functions._
    val kismet_udf = udf { (col1: Int, col2: Int) => List[Int](col1 ,col2) }
    val dot_udf = udf((rateing: Int, rateing_v: Int) => rateing * rateing_v)
    // 數據庫可以存儲集合(使用udf的返回集合)
    // 使用udf一般結合withColumn使用
    val dot = udata.withColumn("dot", kismet_udf(col("rating"), col("rating")))

	//============================細節操作==============================
    // 列轉行使用explode(其中col("itemsimRating")爲數組或列表)
    val userItemScore = dot.select(dot("user_id"), explode(dot("dot"))as("dot_list"))
    // 倒排使用
    userItemScore.orderBy(col("sum_score").desc)
    // map(x=(x(0),x(1))可以直接toMap
    // lit給統一的值要引入(增加一行lable值爲1
    userItemScore.withColumn("label", lit(1))
    // 啓動線程數,至少是兩個。一個線程用於監聽數據源,其他線程用於消費或打印。至少是2個
    val conf = new SparkConf().setMaster("local[5]").setAppName("kafkainput")
    // rdd的排序中這是false即爲倒敘
    udata.rdd.map(x => (x(0).toString, x(2).toString)).map(x => (x._1, x._2.toDouble)).sortBy(_._2,false)
    // 取出單行數據
    udata.head().getAs[String]("user_id")
    //===============================join相關==========================
    // join不同字段時
    val udata_v = udata.selectExpr("user_id as user_v")
    udata.join(udata_v,udata("user_id")===udata_v("user_v"))
    //多字段join
    val trainData = udata_v.join(udata, Seq("user_id", "item_id"), "outer").na.fill(0)
    //增加自增序列col("id")
    val urdd = udata.rdd.zipWithIndex()
    val rowRdd = dfRdd.map(tp => Row.merge(tp._1,Row(tp._2)))
    spark.createDataFrame(rowRdd,udata.schema.add(StructField("id",LongType)))
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章