Apache spark 获取时间戳数据的每周和每日平均值
我目前拥有Spark数据框上的数据,其格式如下:Apache spark 获取时间戳数据的每周和每日平均值,apache-spark,dataframe,apache-spark-sql,sql-timestamp,Apache Spark,Dataframe,Apache Spark Sql,Sql Timestamp,我目前拥有Spark数据框上的数据,其格式如下: Timestamp Number ......... ...... M-D-Y 3 M-D-Y 4900 时间戳数据绝不统一或一致(即,我可能有一个值出现在2015年3月1日,表中的下一个值是2015年9月1日……此外,我可能有多个条目) 所以我想做两件事 计算每周的条目数。因此,我需要一个新表,它表示时间戳列在该行对应的周中的行数。如果存在多个年份,理想情况下,我希望平均每年的值,以获得单个值 平均每周
Timestamp Number
......... ......
M-D-Y 3
M-D-Y 4900
时间戳数据绝不统一或一致(即,我可能有一个值出现在2015年3月1日,表中的下一个值是2015年9月1日……此外,我可能有多个条目)
所以我想做两件事
通过结合
unix\u timestamp
和简单类型转换,使用内置函数可以相对轻松地解析日期:
sqlContext.sql(
“选择CAST(UNIX_时间戳('2015年3月1日,'MMM d,yyyy')作为时间戳)”
).show(假)
// +---------------------+
//|uC0|
// +---------------------+
// |2015-03-01 00:00:00.0|
// +---------------------+
对于DataFrame
DSL,等效代码如下:
import org.apache.spark.sql.functions.unix\u时间戳
unix_时间戳($“日期”,“MMM d,yyyy”).cast(“时间戳”)
要填充缺少的条目,可以使用不同的技巧。最简单的方法是使用与上面相同的解析逻辑。首先,让我们创建几个助手:
def leap(年份:Int)={
((第%4年==0)和&(第%100年!=0))| |(第%400年==0)
}
def weeksForYear(year:Int)=(1到52).map(w=>s“$year$w”)
def daysForYear(year:Int)=(1到{if(leap(2000))366 else 366})(
d=>s“$year$d”
)
和示例参考数据(此处为数周,但您可以在数天内执行相同的操作):
import org.apache.spark.sql.functions.{year,weekofyear}
val exprs=Seq(年($“日期”)。别名(“年”)、周($“日期”)。别名(“周”))
val weeks2015=Seq(2015年)
.flatMap(一年一周)
.map(Tuple1.apply)
.toDF(“日期”)
.withColumn(“日期”,unix_时间戳($“日期”,“yyyy w”).cast(“时间戳”)
.选择(表达式:*)
最后,您可以转换原始数据:
val df=Seq(
(“2015年3月1日”,3),(“2015年9月1日”,4900)).toDF(“时间戳”,“编号”)
val dfParsed=df
.withColumn(“日期”,unix_时间戳($“时间戳”,“MMM d,yyyy”).cast(“时间戳”))
.选择(表达式:+$“数字”:
合并和聚合:
weeks2015.join(dfParsed,Seq(“年”、“周”),“左”)
.groupBy($“年”,“周”)
.agg(计数($“数字”)、平均($“数字”))
.na.填充(0)
听起来很合理。你试过什么了?据我记忆所及,这个问题已经有了不同的变体。@zero323我目前正在尝试使用GroupBy分区执行各种命令。我创建了新的列,指定周数等,并获得平均值。但是,我尝试过的变体目前尚未编译,所以我正在进行编译。因此,您需要两件事:1)能够选择相应的周或日(由内置日期函数覆盖)2)左连接密集数据(基本算术+内置日期函数)@zero323我正在研究日期函数。不过,你介意详细说明一下左边的连接吗?我不太熟悉在那里做什么。