如何在Scala spark中的epoch timestame字段进行分组

时间:2017-10-06 07:18:37

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

我希望按日期分组记录。但是日期是以毫秒为单位的纪元时间戳。 这是样本数据。

restClient

这是我想要实现的目标。

date,   Col1
1506838074000,  a
1506868446000,  b
1506868534000,  c
1506869064000,  a
1506869211000,  c
1506871846000,  f
1506874462000,  g
1506879651000,  a

以下是我尝试分组的代码,

**date  Count of records**
02-10-2017  4
04-10-2017  3
03-10-2017  5

但是在执行代码时我会遇到异常。

import java.text.SimpleDateFormat
val dateformat:SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd")
val df = sqlContext.read.csv("<path>")
val result = df.select("*").groupBy(dateformat.format($"date".toLong)).agg(count("*").alias("cnt")).select("date","cnt")

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您需要将{em> date 列更改为longdate数据类型。这可以通过使用from_unixtime内置函数来完成。然后只需groupByagg函数调用并使用count函数。

import org.apache.spark.sql.functions._
def stringDate = udf((date: Long) => new java.text.SimpleDateFormat("dd-MM-yyyy").format(date))
df.withColumn("date", stringDate($"date"))
    .groupBy("date")
    .agg(count("Col1").as("Count of records"))
    .show(false) 

以上回答是使用udf函数,应该尽可能避免,因为udf是一个黑盒子,需要对列进行序列化和反序列化。

<强>更新

感谢@philantrovert建议除以1000

import org.apache.spark.sql.functions._
df.withColumn("date", from_unixtime($"date"/1000, "yyyy-MM-dd"))
    .groupBy("date")
    .agg(count("Col1").as("Count of records"))
    .show(false)

两种方式都有效。