我希望按日期分组记录。但是日期是以毫秒为单位的纪元时间戳。 这是样本数据。
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")
请帮我解决这个问题。
答案 0 :(得分:1)
您需要将{em> date 列更改为long
到date
数据类型。这可以通过使用from_unixtime
内置函数来完成。然后只需groupBy
和agg
函数调用并使用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)
两种方式都有效。