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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值