Spark - 如何处理数据帧

时间:2017-11-02 02:51:32

标签: scala apache-spark

我是关于spark的新开发者,我需要你的帮助,我的问题,我从csv读取文件。在csv文件中,我有更多行格式为[logDate, id]

示例:

2017-01-11 09:00:00, a
2017-01-11 09:30:00, b
2017-01-11 08:00:00, b

我希望句柄后的数据帧结构为[lastLoginDate, id, firstLoginDate]

预期结果为:(2017-01-11 09:30:00, a, 2017-01-11 09:00:00) (2017-01-11 08:00:00, b,2017-01-11 08:00:00)

现在,我有一个解决方案,但我希望找到更快的方法。我在dataframe中读取了csv文件。之后,我按id和log_date以2路(asc和desc)对数据帧进行排序。最后,我从排序中加入2个数据框,以获取字段的上次登录日期和首次登录日期。

我的架构是

|-- game_code: string (nullable = true) 
|-- last_login_date: string (nullable = true) 
|-- register_date: string (nullable = true) 
|-- id: string (nullable = true) 
|-- sid: string (nullable = true) 
|-- os: string (nullable = true) 
|-- devive: string (nullable = true) 
|-- deviceId: string (nullable = true)

1 个答案:

答案 0 :(得分:0)

您可以使用firstlast内置函数来获取所需的最终数据框

df.orderBy("logDate").groupBy("id").agg(last("logDate").as("lastLoginDate"), first("logDate").as("firstLoginDate"))

你应该得到结果

+---+---------------------+---------------------+
|id |lastLoginDate        |firstLoginDate       |
+---+---------------------+---------------------+
| a |2017-01-11 09:00:00.0|2017-01-11 09:00:00.0|
| b |2017-01-11 09:30:00.0|2017-01-11 08:00:00.0|
+---+---------------------+---------------------+

我希望答案很有帮助

<强>更新

如果您希望全部列为

,则可以在聚合中包含其余列
import org.apache.spark.sql.functions._
df.orderBy("last_login_date").groupBy("id")
  .agg(first("last_login_date").as("firstLoginDate"),
    last("last_login_date").as("lastLoginDate"),
    first("game_code").as("game_code"),
    first("register_date").as("register_date"),
    first("sid").as("sid"),
    first("os").as("os"),
    first("devive").as("devive"),
    first("deviceId").as("deviceId"))
  .show(false)

注意:您可以继续尝试使用Window功能。