sparksql系列(二) sparksql常规操作
一.helloworld
import java.util.Arrays
import org.apache.spark.SparkConf
import org.apache.spark.api.java.JavaSparkContext
import org.apache.spark.sql.{DataFrame, Row, SparkSession, functions}
import org.apache.spark.sql.functions.{col, desc, length, row_number, trim, when}
import org.apache.spark.sql.functions.{countDistinct,sum,count,avg}
import org.apache.spark.sql.types.{LongType, StringType, StructField, StructType}
import org.apache.spark.sql.expressions.Window
import org.apache.spark.storage.StorageLevel
import org.apache.spark.sql.SaveMode
object WordCount {
def initSparkAndData() : DataFrame = {
val sparkSession= SparkSession.builder().master("local").appName("AppName").getOrCreate()
val javasc = new JavaSparkContext(sparkSession.sparkContext)
val nameRDD = javasc.parallelize(Arrays.asList("{'name':'wangwu','age':'18','vip':'t'}",
"{'name':'sunliu','age':'19','vip':'t'}","{'name':'zhangsan','age':'20','vip':'f'}"));
val namedf = sparkSession.read.json(nameRDD)
namedf
}
def main(args: Array[String]): Unit = {
val data = initSparkAndData()
}
}
上面讲sparksession初始化和数据的加载定义为一个方法,方便后续叙述
二.select,filter,groupby,sum
val data = initSparkAndData()
val simpleoption = data.select(col("name"),col("age"),col("vip"))
.filter(col("name") =!= "zhangsan" && col("vip") === "t") //其实是zhangsan的过滤,主要是展示===和=!=的写法
.groupBy(col("vip")) //sql理解就是 group by 语句
.agg(sum(col("age")) as "sumage") //sql理解就是 sum语句
.show(100) //显示vip、sumage两列,sparksql自动补齐
val simpleoption = data.select(col("name"),col("age"),col("vip"))
.filter(col("name") =!= "zhangsan" && col("vip") === "t")
.groupBy(col("vip"))
.agg(avg(col("age")) as "avgage") //求平均值
.show(100)
val simpleoption = data.select(col("name"),col("age"),col("vip"))
.filter(col("name") =!= "zhangsan" && col("vip") === "t")
.groupBy(col("vip"))
.agg(count(col("vip")) as "vipnumber") //count个数
.show(100)
val simpleoption = data.select(col("name"),col("age"),col("vip"))
.filter(col("name") =!= "zhangsan" && col("vip") === "t")
.groupBy(col("vip"))
.agg(countDistinct(col("vip")) as "vipnumber") //count个数的时候去重
.show(100)
三.DataFrame中sum值转换为数字
DataFrame中没有将sum的值转换为数字的直接方法,所以需要自己手动写
val data = initSparkAndData()
val simpleoption = data.select(col("name"),col("age"),col("vip"))
.filter(col("name") === "zhangsan" && col("vip") =!= "t")
.groupBy(col("vip"))
.agg(sum(col("age")) as "sumage")
val collection = simpleoption.select(col("sumage")).rdd.collect()
val value = if(collection.length > 0) collection.apply(0).toString().replace("[", "").replace("]", "").toString() else "0"
println(collection.apply(0).toString())
println(value)
四.DataFrame中列in使用
val data = initSparkAndData()
val nameList1 = List("wangwu","zhangsan")
val nameList2 = data.select(col("name")).rdd.map(r => r(0).toString).collect().toList
println(nameList1)
println(nameList2)
val simpleoption = data.select(col("name"),col("age"),col("vip"))
.filter(col("name").isin(nameList1:_*)).show(100)
五.DataFrame中case when
val sparkSession = SparkSession.builder().master("local").getOrCreate()
val javasc = new JavaSparkContext(sparkSession.sparkContext)
val nameRDD1 = javasc.parallelize(Arrays.asList("{'id':'7'}", "{'id':'8'}", "{'id':'9'}"));
val nameRDD1df = sparkSession.read.json(nameRDD1)
nameRDD1df.withColumn("idNumber",
when(col("id") === "7","id7").when(col("id") === "8","id8")
.when(col("id") === "9","id9").otherwise("idother")
).show(100)
搬砖多年终不得要领,遂载源码看之望得真经。
分类:
spark-sql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?