如何使用Sparksql计算最小的unixtimestamp值?

时间:2018-08-07 09:08:52

标签: scala apache-spark dataframe apache-spark-sql

completion time | unixtimestamp | user|
0.07            |1529094938000  |user3|  
0.16            |1529094944000  |user2|
0.27            |1529094947000  |user1|
0.08            |1529094950000  |user2|
0.24            |1529094953000  |user1|
0.10            |1529094956000  |user1|
0.64            |1529094959000  |user3|
0.13            |1529094962000  |user3|
0.67            |1529094965000  |user1|

我想要每个用户的最小时间戳。我们如何使用Sparksql做到这一点?

假设上表在一个数据框中。

2 个答案:

答案 0 :(得分:0)

如果不是偶然,我们将首先将时间戳字段转换为整数类型。

val new_dataframe =  dataframe.select($"unixtimestamp".cast(IntegerType).as("unixtimestamp"))

1)如果不使用SparkContext对象,则在spark中创建sqlContext

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

2)将此数据帧注册为表

new_dataframe.registerTempTable("user_timestamp_data")

3)现在,使用先前创建的sqlContext,我们可以查询为

    val result = 
    sqlContext.sql("SELECT q.user,ROUND(UNIX_TIMESTAMP(q.min)*1000) as 
    MinimumUnixTimeStamp
    FROM (
    select  user, MIN(FROM_UNIXTIME(unixtimestamp/1000) min 
    FROM user_timestamp_data
    GROUP BY user
    ORDER BY user ASC) AS q ")

这应该为您提供用户及其相应的最小时间戳值

答案 1 :(得分:0)

使用groupByagg

val df2 = df.groupBy("user").agg(min(col("unixtimestamp")))