准备代码
| |
| Logger.getLogger("org.apache.spark").setLevel(Level.WARN) |
| |
| val spark = SparkSession |
| .builder() |
| .appName("SparkSessionT") |
| .master("local[1]") |
| .getOrCreate() |
| |
| val commodityDF = spark.read.format("jdbc") |
| .option("url", "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC") |
| .option("driver", "com.mysql.jdbc.Driver") |
| .option("dbtable", "commodityPrice") |
| .option("user", "root") |
| .option("password", "123456") |
| .load() |
使用SQL语句查询
| |
| commodityDF.registerTempTable("commodityTable") |
| spark.sql("select * from commodityTable").show(10) |
查看数据
| |
| commodityDF.show() |
| |
| commodityDF.show(false) |
| |
| commodityDF.show(10, false) |
| |
| commodityDF.limit(5).show(false) |
加载数据到数组
| |
| commodityDF.collect().foreach(println) |
| |
| commodityDF.collectAsList() |
获取指定字段的统计信息
| |
| commodityDF.describe("price", "yprice").show(false) |
| |
| commodityDF.describe("price", "yprice").collect().foreach(println) |
| |
| println(commodityDF.describe("price", "yprice").collect()(0)) |
获取n行数据
| |
| println(commodityDF.first()) |
| println(commodityDF.head()) |
| |
| commodityDF.head(5).foreach(println) |
| commodityDF.take(5).foreach(println) |
| |
| commodityDF.takeAsList(5) |
条件查询
| |
| commodityDF.where("price>100 or yprice<200").show() |
| commodityDF.filter("price>100 or yprice<200").show() |
选取字段
| |
| commodityDF.select("name", "price").show(5, false) |
| |
| commodityDF.select(commodityDF("name"), commodityDF("price") + 100).show(5) |
| |
| commodityDF.selectExpr("name", "price as p", "round(price)").show(10) |
| |
| val name = commodityDF.col("name") |
| val parice = commodityDF.apply("price") |
删除指定字段
| |
| val c1 = commodityDF.drop("price") |
| val c2 = c1.drop(c1("yprice")) |
| c2.show(5) |
排序
| |
| commodityDF.orderBy(-commodityDF("price")).show(5) |
| commodityDF.orderBy(commodityDF("price").desc).show(5) |
| |
| commodityDF.orderBy("price").show(5) |
| commodityDF.orderBy(commodityDF("price")).show(5) |
分组
| |
| commodityDF.groupBy("degree").count().show(5) |
| commodityDF.groupBy(commodityDF("degree")).count().show(5) |
| commodityDF.groupBy(commodityDF("degree")).max("price", "yprice").show(5) |
agg聚合
| |
| commodityDF.agg("price" -> "max", "yprice" -> "sum").show() |
| |
| commodityDF.groupBy("degree").agg("price" -> "max", "downNum" -> "mean").show() |
去除重复数据
| |
| val df = commodityDF.drop("id") |
| println(df.count()) |
| |
| println(df.distinct().count()) |
| |
| println(df.dropDuplicates(Seq("price", "yprice")).count()) |
同字段数据组合(unionAll)
| |
| commodityDF.limit(5).unionAll(commodityDF.limit(5)).show() |
同字段数据行组合(join)
| |
| val df1 = commodityDF.limit(5) |
| val df2 = commodityDF.limit(10) |
| val df3 = commodityDF.filter("id>5 and id<11") |
| |
| df1.join(df2, "id").show() |
| df1.join(df2, df1("id") === df2("id")).show() |
| df1.join(df2, df1("id") === df2("id"), "inner").show() |
| |
| df2.join(df3, Seq("id", "name")).show() |
Dataframe的逻辑操作
| |
| df1.intersect(df2).show() |
| |
| df2.except(df3).show() |
重命名字段名
| |
| commodityDF.limit(5).show() |
| commodityDF.withColumnRenamed("name", "reName").limit(5).show() |
添加字段
| |
| commodityDF.withColumn("newCol", commodityDF("name")).show() |
拆分字段数据为行数据(字段本身并不删除)
| // 将列字段数据拆分为行数据 |
| commodityDF.limit(1).explode("name", "name_") { time: String => time.split(" ") }.show() |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一次Java后端服务间歇性响应慢的问题排查记录