scala - Apache Spark将多行连接成一行中的列表
问题描述
N
我需要从将用户的数据按行存储到一行列表中的源表中创建一个表(配置单元表/火花数据框) 。
User table:
Schema: userid: string | transactiondate:string | charges: string
----|------------|-------|
123 | 2017-09-01 | 20.00 |
124 | 2017-09-01 | 30.00 |
125 | 2017-09-01 | 20.00 |
126 | 2017-09-01 | 30.00 |
456 | 2017-09-01 | 20.00 |
457 | 2017-09-01 | 30.00 |
458 | 2017-09-01 | 20.00 |
459 | 2017-09-01 | 30.00 |
输出表应该是
User table:
Schema: userid: string | transactiondate:string | charges: string
------------------|-----------------------------------------------|-------------------------
[123,124,125,126] | [2017-09-01,2017-09-01,2017-09-01,2017-09-01] | [20.00,30.00,20.00,30.00]
[456,457,458,459] | [2017-09-01,2017-09-01,2017-09-01,2017-09-01] | [20.00,30.00,20.00,30.00]
解决方案
您需要创建一个键值来对数据进行分组。我做了一个id
专栏和groupBy
这个专栏。
import org.apache.spark.sql.expressions.Window
val N = 4
val agg_list = df.columns.map(c => collect_list(c).as(c))
val w = Window.orderBy("transactiondate", "userid")
df.withColumn("id", ((row_number.over(w) - 1) / N).cast("int"))
.groupBy("id")
.agg(agg_list.head, agg_list.tail: _*)
.drop("id").show(false)
结果是:
+--------------------+------------------------------------------------------------------------------------+------------------------+
|userid |transactiondate |charges |
+--------------------+------------------------------------------------------------------------------------+------------------------+
|[123, 124, 125, 126]|[2017-09-01 00:00:00, 2017-09-01 00:00:00, 2017-09-01 00:00:00, 2017-09-01 00:00:00]|[20.0, 30.0, 20.0, 30.0]|
|[456, 457, 458, 459]|[2017-09-01 00:00:00, 2017-09-01 00:00:00, 2017-09-01 00:00:00, 2017-09-01 00:00:00]|[20.0, 30.0, 20.0, 30.0]|
+--------------------+------------------------------------------------------------------------------------+------------------------+
推荐阅读
- asp.net-core - 如何使用 Microsoft Graph API 获取 .net 核心应用程序中的所有授权组?
- python-3.x - Eulclid 算法:Python 代码在递归结束时返回 None
- google-chrome - 如何在每个网页加载时运行 chrome 扩展的后台脚本?
- flutter - Flutter:自动完成文本字段不适用于自定义数据类型
- java - 划分直到达到某个数字并存储循环划分的次数
- azure - 有没有办法使用 rest api 在特定的 Azure Devops 项目中获取用户权限?
- mysql - 如何连接到位于r闪亮中本地的sql数据库
- mingw - 为什么我不能在 MSYS2 中安装 MingW 包?
- node.js - nodejs mqtt客户端包收到消息后如何发送确认?
- php - PHP 患者转诊表