Spark DataFrame中rollup和cube使用

本文通过实例展示了Spark DataFrame中rollup与cube函数的使用方法。rollup按指定维度进行分组汇总,cube则包括所有可能的维度组合。两者均可简化多维度报表的生成过程。

Spark DataFrame中rollup和cube使用

我们平时在做报表的时候,经常会有各种分维度的汇总计算,在spark中我们最常用的就是groupBy操作,groupBy就是按照给定的字段名分组,后面接sum、count、avg等聚合操作;在spark中也提供了rollupcube这样的分组函数,接下来本文就以一个实例展示一下这两个函数的作用。
我们先来看个需求:下面的表是某公司最近两年在全国各地的销售额,我们想要知道xiang华北地区的销售情况、北京地区的销售情况等,我们使用两次Groupby操作就能得到结果,也可以使用rollup实现聚合结果
某公式销售额情况.png

  // 加载销售额数据
  val salesDF = spark.read .csv(inputFile)
rollup的使用:

rollup($“area”, $“regional”, $“year”) 会先按照 area、regional、year分组;然后按照area、regional分组、然后再按照area分组,最后进行全表分组。后面接聚合函数,此处使用的是sum

 salesDF.rollup($"area", $"regional", $"year")
.sum("sales")
rollup之后的结果查看:

rollup.png


cube的使用

cube就更厉害了 salesDF.cube($“area”, $“regional”, $“year”) ;cube 会先按照(area、regional、yea)分组;然后是 (area、regional )、(area、year )、(area )、(regional、year )、( regiona )、(year )分组;最后进行全表分组。

    salesDF.cube($"area", $"regional", $"year")  .sum("sales")
cube结果:

cube.png

### 如何在 Spark使用 DataFrame Dataset 执行 SQL 查询 在 Spark 中,DataFrame Dataset 是两种重要的数据抽象,它们支持通过 SQL 查询的方式对数据进行操作。以下是具体的实现方式: #### 使用 DataFrame 执行 SQL 查询 1. 首先需要创建一个 SparkSession 实例,这是 Spark SQL 的入口[^1]。 2. 通过 `spark.read` 方法加载数据并将其转换为 DataFrame[^4]。 3. 将 DataFrame 注册为临时视图(temporary view),以便可以对其进行 SQL 查询。 4. 使用 `spark.sql()` 方法执行 SQL 查询,并将结果返回为一个新的 DataFrame[^1]。 ```python from pyspark.sql import SparkSession # 创建 SparkSession spark = SparkSession.builder.appName("example").getOrCreate() # 加载数据到 DataFrame dataFrame = spark.read.format("csv").option("header", "true").load("example.csv") # 注册临时视图 dataFrame.createOrReplaceTempView("table_name") # 执行 SQL 查询 result_df = spark.sql("SELECT * FROM table_name WHERE condition") result_df.show() ``` #### 使用 Dataset 执行 SQL 查询 1. 类似于 DataFrame,Dataset 也可以通过注册为临时视图来执行 SQL 查询[^5]。 2. 在 Spark 中,Dataset 可以看作是强类型的 DataFrame,因此其 SQL 查询的执行方式与 DataFrame 基本相同[^5]。 3. 注意,尽管 Dataset 支持强类型操作,但在执行 SQL 查询时,查询结果仍然是 DataFrame 类型[^5]。 ```scala import org.apache.spark.sql.SparkSession // 创建 SparkSession val spark = SparkSession.builder().appName("example").getOrCreate() // 加载数据到 Dataset case class Person(name: String, age: Int) val ds = spark.read.format("csv").option("header", "true").load("example.csv").as[Person] // 注册临时视图 ds.createOrReplaceTempView("people") // 执行 SQL 查询 val result_df = spark.sql("SELECT * FROM people WHERE age > 30") result_df.show() ``` #### 强类型的 Dataset 操作 除了通过 SQL 查询外,Dataset 还支持直接使用强类型 API 进行操作。这种方式避免了 SQL 字符串的编写,提供了编译时类型检查[^5]。 ```scala // 使用强类型 API 操作 Dataset val filteredDs = ds.filter(person => person.age > 30) filteredDs.show() ``` ### 总结 - DataFrame Dataset 都可以通过注册临时视图的方式执行 SQL 查询。 - Dataset 提供了强类型的 API,允许在编译时进行类型检查,而 DataFrame 则是弱类型的[^5]。 - 在实际应用中,可以根据需求选择使用 SQL 查询或强类型 API 来处理数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值