计算不断增加的日期Spark的序列

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (20)

我在Spark中有一个带有名称列和日期的数据框。我希望找到每个名称不断增加的日期(日复一日)的所有连续序列,并计算它们的持续时间。输出应包含名称,开始日期(日期序列)和此类时间段的持续时间(天数)如何使用Spark函数执行此操作?

连续的日期序列示例:

2019-03-12
2019-03-13
2019-03-14
2019-03-15

我已经定义了这样的解决方案,但是它按每个名称计算总天数,并且不将其划分为序列:

val result = allDataDf
    .groupBy($"name")
    .agg(count($"date").as("timePeriod"))
    .orderBy($"timePeriod".desc)
    .head()

另外,我尝试使用排名,但计数列只有1,原因是:

val names = Window
    .partitionBy($"name")
    .orderBy($"date")
 val result = allDataDf
    .select($"name", $"date", rank over names as "rank")
    .groupBy($"name", $"date", $"rank")
    .agg(count($"*") as "count")

输出如下所示:

+-----------+----------+----+-----+
|stationName|      date|rank|count|
+-----------+----------+----+-----+
|       NAME|2019-03-24|   1|    1|
|       NAME|2019-03-25|   2|    1|
|       NAME|2019-03-27|   3|    1|
|       NAME|2019-03-28|   4|    1|
|       NAME|2019-01-29|   5|    1|
|       NAME|2019-03-30|   6|    1|
|       NAME|2019-03-31|   7|    1|
|       NAME|2019-04-02|   8|    1|
|       NAME|2019-04-05|   9|    1|
|       NAME|2019-04-07|  10|    1|
+-----------+----------+----+-----+
提问于
用户回答回答于

在SQL中查找连续日期相当容易。您可以使用以下查询执行此操作:

WITH s AS (
   SELECT
    stationName,
    date,
    date_add(date, -(row_number() over (partition by stationName order by date)) + 1) as discriminator
  FROM stations
)
SELECT
  stationName,
  MIN(date) as start,
  COUNT(1) AS duration
FROM s GROUP BY stationName, discriminator

幸运的是,我们可以在spark中使用SQL。让我们检查它是否有效(我使用了不同的日期):

val df = Seq(
       ("NAME1", "2019-03-22"),
       ("NAME1", "2019-03-23"),
       ("NAME1", "2019-03-24"),
       ("NAME1", "2019-03-25"),

       ("NAME1", "2019-03-27"),
       ("NAME1", "2019-03-28"),

       ("NAME2", "2019-03-27"),
       ("NAME2", "2019-03-28"),

       ("NAME2", "2019-03-30"),
       ("NAME2", "2019-03-31"),

       ("NAME2", "2019-04-04"),
       ("NAME2", "2019-04-05"),
       ("NAME2", "2019-04-06")
  ).toDF("stationName", "date")
      .withColumn("date", date_format(col("date"), "yyyy-MM-dd"))

df.createTempView("stations");

  val result = spark.sql(
  """
     |WITH s AS (
     |   SELECT
     |    stationName,
     |    date,
     |    date_add(date, -(row_number() over (partition by stationName order by date)) + 1) as discriminator
     |  FROM stations
     |)
     |SELECT
     |  stationName,
     |  MIN(date) as start,
     |  COUNT(1) AS duration
     |FROM s GROUP BY stationName, discriminator
   """.stripMargin)

result.show()

它似乎输出正确的数据集:

+-----------+----------+--------+
|stationName|     start|duration|
+-----------+----------+--------+
|      NAME1|2019-03-22|       4|
|      NAME1|2019-03-27|       2|
|      NAME2|2019-03-27|       2|
|      NAME2|2019-03-30|       2|
|      NAME2|2019-04-04|       3|
+-----------+----------+--------+

热门问答

关于Linux DNS服务器设置问题?

mariolu

腾讯 · 后台开发工程师 (已认证)

CDN及云从业者
推荐

CNAME到XX.com,这个XX.COM本身也是需要能解析ip的。CNAME到XX.COM的意义是你能解析到CDN厂商A的域名XX.COM或者CDN厂商B的域名YY.COM。所以需要提供服务的CDN厂商给你他们的域名。这样,DNS查询链路才是完整的。

我刚申请的服务器,缺省给我的是linux,可我要Windows,怎么办?

蒋小爱

腾讯云 · 技术支持 (已认证)

推荐
云服务器提供 不同平台重装:仅支持中国大陆地区(不含中国香港)。 例如,Linux 重装为 Windows,Windows 重装为 Linux 。 参考 重装系统: https://cloud.tencent.com/document/product/213/4933 图片.p...... 展开详请

云服务器不能访问外部网站?

HappyLau谈云计算

腾讯云 · 云计算高级工程师 (已认证)

专注于公有云,私有云解决方案,在kubernetes,openstack,kvm,ceph,linux,shell有丰富的实战经验。
推荐
不能访问外部网站一般是网络和dns的问题,按照如下步骤排查: 1. 确保CVM有外网ip或者NAT转换,使用ping测试下外网的连通性,如果不通请购买弹性公网IP,先申请后购买参考https://cloud.tencent.com/document/product/215/201...... 展开详请

两台腾讯云的服务器在同一个地区,内网网段也相同,都是172.17.0.X,为啥ping内网地址不通?

HappyLau谈云计算

腾讯云 · 云计算高级工程师 (已认证)

专注于公有云,私有云解决方案,在kubernetes,openstack,kvm,ceph,linux,shell有丰富的实战经验。
推荐已采纳

首先看下两台机器是否在同个vpc内,在同个vpc内默认网络可以互通,如果不在同个vpc内需要通过对等连接或者云联网打通,如果在同个vpc下无法互通,请检查下安全组和os的防火墙规则,放行icmp连接。

合作伙伴学院里的学习视频测试题和在线培训系统里的测试题能否提供答案?

骑牛看晨曦love&peace~
推荐

http://tencentcloudxuexi.com 合作伙伴可以登录此平台做练习题,有答案的喔

求问keil5项目无法下载到开发板该怎么解决?

Supowang

腾讯 · 高级工程师 (已认证)

腾讯物联网操作系统TencentOS tiny产品接口人---岁寒知松柏,做最好的自己!
推荐
请检查st-link的驱动和stlink硬件,如果不行,尝试换其他stlink下载器试试,谢谢! 如果还没有解决,请加TencentOS tiny官方QQ群提问,谢谢! qq.png ... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券