該文章記錄使用的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)))
}
}