加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何比较多行?

发布时间:2020-12-16 09:24:36 所属栏目:安全 来源:网络整理
导读:我想将两个连续的行i与col2的i-1进行比较(按col1排序). 如果第i行的item_i和item_ [i-1] _row不同,我想将item_ [i-1]的计数增加1. +--------------+| col1 col2 |+--------------+| row_1 item_1 || row_2 item_1 || row_3 item_2 || row_4 item_1 || row_5
我想将两个连续的行i与col2的i-1进行比较(按col1排序).

如果第i行的item_i和item_ [i-1] _row不同,我想将item_ [i-1]的计数增加1.

+--------------+
| col1 col2    |
+--------------+
| row_1 item_1 |
| row_2 item_1 |
| row_3 item_2 |
| row_4 item_1 |
| row_5 item_2 |
| row_6 item_1 |
+--------------+

在上面的示例中,如果我们一次向下扫描两行,我们会看到row_2和row_3不同,因此我们在item_1中添加了一行.接下来,我们看到row_3与row_4不同,然后将一个添加到item_2.继续,直到我们最终:

+-------------+
|  col2  col3 |
+-------------+
|  item_1  2  |
|  item_2  2  |
+-------------+

解决方法

您可以使用窗口函数和聚合的组合来执行此操作. window函数用于获取col2的下一个值(使用col1进行排序).然后聚合计算我们遇到差异的次数.这在以下代码中实现:

val data = Seq(
  ("row_1","item_1"),("row_2",("row_3","item_2"),("row_4",("row_5",("row_6","item_1")).toDF("col1","col2")

import org.apache.spark.sql.expressions.Window
val q = data.
  withColumn("col2_next",coalesce(lead($"col2",1) over Window.orderBy($"col1"),$"col2")).
  groupBy($"col2").
  agg(sum($"col2" =!= $"col2_next" cast "int") as "col3")

scala> q.show
17/08/22 10:15:53 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition,this can cause serious performance degradation.
+------+----+
|  col2|col3|
+------+----+
|item_1|   2|
|item_2|   2|
+------+----+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读