首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spark中聚合行对象

在Spark中聚合行对象
EN

Stack Overflow用户
提问于 2021-09-17 01:10:23
回答 2查看 55关注 0票数 1

我有一个类似于下面的表格:

代码语言:javascript
复制
| id | item                                 |
| -- | ------------------------------------ |
| 1  | {order_id: 1, item_id: 1, price: 10} |
| 2  | {order_id: 1, item_id: 2, price: 11} |
| 3  | {order_id: 2, item_id: 3, price: 12} |
| 4  | {order_id: 2, item_id: 4, price: 13} |

我需要将表中的行聚合到以下内容中:

代码语言:javascript
复制
| order_id | order                                                                    |
| -------- | ------------------------------------------------------------------------ |
| 1        | {order_id: 1, items: [{item_id: 1, price: 10}, {item_id: 2, price: 11}]} |
| 2        | {order_id: 2, items: [{item_id: 3, price: 12}, {item_id: 4, price: 13}]} |

最初我认为UDAF可以做到这一点,但当我实现一个聚合器UDAF函数时,我不确定在merge方法中返回什么,因为如果order id不同,它们就不能被合并。

EN

回答 2

Stack Overflow用户

发布于 2021-09-17 01:29:30

假设模型如下:

代码语言:javascript
复制
case class Order(order_id: Int, items: Seq[Item])
case class Item(item_id: Int, price: Double)
case class Line(item: Item)

使用groupByitem.order_id对行进行分组,然后收集以下项:

代码语言:javascript
复制
import sparkSession.implicits._

df.groupBy($"item.order_id")
  .as[Int, Line]
  .mapGroups { case (order_id, lines) =>
    (order_id, Order(order_id, lines.toSeq.map(line => Item(line.item.item_id, line.item.price))))
  }
票数 0
EN

Stack Overflow用户

发布于 2021-09-17 07:16:31

从Spark1.6及更高版本开始,您不需要UDAF,您可以使用内置的SQL函数collect_list来聚合行对象

如果您表架构如下:

代码语言:javascript
复制
root
 |-- id: integer (nullable = false)
 |-- item: struct (nullable = true)
 |    |-- order_id: integer (nullable = true)
 |    |-- item_id: integer (nullable = true)
 |    |-- price: double (nullable = true)

dataframe中加载表之后,您的代码应该是:

代码语言:javascript
复制
import org.apache.spark.sql.functions.{collect_list, struct}

dataframe
  .groupBy("item.order_id")
  .agg(collect_list(struct("item.item_id", "item.price")).as("items"))
  .withColumn("order", struct("order_id", "items"))
  .drop("items")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69216699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档