scala - Spark(Scala)成对减去数据框中的所有行
问题描述
我有一个数据框,看起来类似于:
+-----+-----+------+-----+
|col1 |col2 |col3 |col4 |
+-----+-----+------+-----+
|1.1 |2.3 |10.0 |1 |
|2.2 |1.5 |5.0 |1 |
|3.3 |1.3 |1.5 |1 |
|4.4 |0.5 |7.0 |1 |
|5.5 |1.2 |8.1 |2 |
|6.6 |2.3 |8.2 |2 |
|7.7 |4.5 |10.3 |2 |
+-----+-----+------+-----+
我想从上面的行中减去每一行,但前提是它们在 col4 中有相同的条目,所以 2-1、3-2 但不是 5-4。col4 也不应该改变,所以结果是
+-----+-----+------+------+
|col1 |col2 |col3 |col4 |
+-----+-----+------+------+
|1.1 |-0.8 |-5.0 |1 |
|1.1 |-0.2 |-3.5 |1 |
|1.1 |-0.8 |5.5 |1 |
|1.1 |1.1 |0.1 |2 |
|1.1 |2.2 |2.1 |2 |
+-----+-----+------+------+
这听起来很简单,但我似乎无法弄清楚
解决方案
您可以使用spark-sql完成此操作,即使用您的数据框创建一个临时视图并应用以下 sql。它使用窗口函数减去由 排序和分区LAG
的前一行值。每个分组中的第一行值由使用和过滤标识。col1
col4
col4
row_number
df.createOrReplaceTempView('my_temp_view')
results = sparkSession.sql('<insert sql below here>')
SELECT
col1,
col2,
col3,
col4
FROM (
SELECT
(col1 - (LAG(col1,1,0) OVER (PARTITION BY col4 ORDER BY col1) )) as col1,
(col2 - (LAG(col2,1,0) OVER (PARTITION BY col4 ORDER BY col1) )) as col2,
(col3 - (LAG(col3,1,0) OVER (PARTITION BY col4 ORDER BY col1) )) as col3,
col4,
ROW_NUMBER() OVER (PARTITION BY col4 ORDER BY col1) rn
FROM
my_temp_view
) t
WHERE rn <> 1
推荐阅读
- here-api - 自定义路由扩展,拒绝访问
- java - HazelcastSerializationException 在调用 CacheManager.createCache() 时使用 Subzero/Kryo 作为全局序列化程序
- javascript - 使用 JSON 将数据从 PHP 数组传递到 Highcharts 图表
- python-2.7 - 从保存的电子邮件中提取 Outlook 附件
- vue.js - Vue 2 将选定的数据发送回父组件
- python - 括号内的非贪婪正则表达式并包含文本
- vbscript - VBS 同步中心 同步离线文件
- python - 熊猫中的 SettingWithCopyWarning
- git - 如何更新合并分支中 Git 提交的作者?
- android - Android SharedPreference JSON 未被访问