我是关于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)
答案 0 :(得分:0)
您可以使用first
和last
内置函数来获取所需的最终数据框
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
功能。