开发者社区> 问答> 正文

每个用户的行之间的时间戳差异 - Pyspark Dataframe

我有一个具有以下结构的CSV文件

USER_ID location timestamp
1 1001 19:11:39 5-2-2010
1 6022 17:51:19 6-6-2010
1 1041 11:11:39 5-2-2010
2 9483 10:51:23 3-2-2012
2 4532 11:11:11 4-5-2012
3 4374 03:21:23 6-9-2013
3 4334 04:53:13 4-5-2013
基本上我想用pyspark或者只用python来计算具有相同user_id号的不同位置的时间戳差异。预期结果的一个例子是:

USER_ID location timestamp difference
1 1001-1041 08:00:00

展开
收起
社区小助手 2018-12-12 13:24:23 2809 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    假设您想要用户的每个可能的位置组合,您只需要在USER_ID上进行连接,然后减去日期列。这里的一个技巧是使用unix_timestamp将日期时间数据解析为支持减法操作的整数。

    示例代码:

    from pyspark.sql.functions import unix_timestamp, col, datediff

    data = [

    (1, 1001, '19:11:39 5-2-2010'),
    (1, 6022, '17:51:19 6-6-2010'),
    (1, 1041, '11:11:39 5-2-2010'),
    (2, 9483, '10:51:23 3-2-2012'),
    (2, 4532, '11:11:11 4-5-2012'),
    (3, 4374, '03:21:23 6-9-2013'),
    (3, 4334, '04:53:13 4-5-2013')

    ]

    df = spark.createDataFrame(data, ['USER_ID', 'location', 'timestamp'])
    df = df.withColumn('timestamp', unix_timestamp('timestamp', 'HH:mm:ss dd-MM-yyyy'))

    Renaming columns to avoid conflicts after join

    df2 = df.selectExpr('USER_ID as USER_ID2', 'location as location2', 'timestamp as timestamp2')
    cartesian = df.join(df2, col("USER_ID") == col("USER_ID2"), "inner")

    Filter to get rid of reversed duplicates, and rows where location is same on both sides

    pairs = cartesian.filter("location < location2") \

                 .drop("USER_ID2") \
                 .withColumn("diff", col("timestamp2") - col("timestamp"))

    pairs.show()

    2019-07-17 23:20:06
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Apache Flink 流式应用中状态的数据结构定义升级 立即下载
《Apache Flink-重新定义计算》PDF下载 立即下载
LEARNINGS USING SPARK STREAMING & DATAFRAMES FOR WALMART SEARCH 立即下载