1.内置函数
准备工作,先写个main方法,准备一些数据
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder()
.master("local").appName("HiveSourceApp")
.getOrCreate()
//准备的数据
val userAccessLog = Array (
"2016-10-01,1122",
"2016-10-01,1122",
"2016-10-01,1123",
"2016-10-01,1124"
)
//隐式转换
import spark.implicits._
// Array ==> RDD
val userAccessRDD: RDD[String] = spark.sparkContext.parallelize(userAccessLog)
//RDD => DF
val userAccessDF: DataFrame = userAccessRDD.map(x => {
val splits: Array[String] = x.split(",")
Log(splits(0), splits(1).toInt)
}).toDF
//导入内置函数
spark.stop()
}
case class Log(day:String,userId:Int)
数据准备好了
// userAccessDF.groupBy("day").agg(count("userId").as("pv")).show()
userAccessDF.groupBy("day").agg(count("userId").as("uv")).show()
控制台:
如果要userid去重
userAccessDF.groupBy("day").agg(countDistinct("userId").as("uv")).show()
控制台:
2. 自定义函数
自定义函数3步骤:
1.定义函数
2.注册函数
3.使用函数
//这是我们用到的数据分隔符是"###"
dam###run,jump,sing
mk###swim,dance
编写main方法
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder()
.master("local").appName("HiveSourceApp")
.getOrCreate()
import spark.implicits._
//获取数据并转成df
val infoRDD: RDD[String] = spark.sparkContext.textFile("data/hobbies.txt")
val infoDF: DataFrame = infoRDD.map(_.split("###")).map(x => {
Hobbies(x(0), x(1))
}).toDF
//定义函数 和 注册函数,两个参数
//1.函数名
//2.函数逻辑
spark.udf.register("hobby_num", (s:String) => s.split(",").size)
//将数据创建成视图
infoDF.createOrReplaceTempView("hobbies")
//函数的使用,直接写sql语句就行
spark.sql("select name, hobbies, hobby_num(hobbies) as hobby_count from hobbies").show(false)
// select name, hobby_num(hobbies) from xxx
spark.stop()
}
case class Hobbies(name:String, hobbies:String)
看看控制台:
需求完成