当前,我们正在使用日历实例读取日期,以便使用sparksql来选择最近一个月的记录。现在我们需要:如果在前一天添加了额外的事件,我们还必须能够手动插入摘要开始和结束日期,以防我们需要在先前时间段内手动重新执行工作: 例如:手动重新运行表可能如下所示:
rprtng_period_type_cd summary_start_date summary_end_date summary_iv
M 2018-01-01 2018-01-31 2018-01
D 2018-03-05 2018-03-05 2018-03-05
D 2018-03-27 2018-03-27 2018-03-27
这应该告诉工作以计算1月18日的月度摘要和两份每日摘要,一份为3月5日,一份为3月27日
作业应使用summary_start_date
summary_end_date
,并确保仅在这两个日期之间具有event_dt
的事件才包括在计算中。
我当前的代码段如下:
def execute(): Dataframe = {
//log files
val hivecntxt = SparkContextLoader.hiveContext
val eventsourceTable= cusotmermetricConstants.source_table
// Calendar information
val abc = Calendar.getInstance
abc.add(Calendar.month, -1)
var month = abc.get(Calendar.MONTH)
var year = abc.get(Calendar.YEAR)
var fileMonth = month + 1
var monthStr = if (fileMonth<=9) {
monthStr ="0" + fileMonth.toString
} else {
monthStr = fileMonth.toString
}
//testing purpose
monthStr = "11"
year = 2016
val monthlyEventDf = hiveContext.sql("select * from " + referenceDB + " ." + eventsourceTable + "where(unix_timestamp(event_Dt, "yyyy-mm"))")=unix_timestamp("' +year+ "-"+"monthstr"+"',+'yyyy-MM'))")
val uniquedf = monthlyEventDf.repartition(col("event_Id")).withColumn("rank",rank().over(Window.partitionBy("event_Id").orderBy(desc("somevalue")))
val monthlyEventfinal = monthlyEventDf.persist(StorageLevel.Memory_AND_DISK)
return monthlyEventfinal
}
在哪里可以编辑当前模块中的需求 寻找建议
答案 0 :(得分:0)
您可以使用filter
功能选择如下范围内的记录
//Input df
+---+----------+----------+
| cd|start_date| end_date|
+---+----------+----------+
| M|2018-01-01|2018-01-31|
| D|2018-05-03|2018-05-03|
| D|2018-03-27|2018-03-27|
+---+----------+----------+
//Parameter startDate and endDate
val endDate="2018-05-03"
val endDate="2018-05-03"
//Filter condition
df.filter(s"start_date>='$startDate' and end_date<='$endDate'").show
//Sample Output:
+---+----------+----------+
| cd|start_date| end_date|
+---+----------+----------+
| D|2018-05-03|2018-05-03|
| D|2018-03-27|2018-03-27|
+---+----------+----------+
我希望这会对您有所帮助,如果您想对过滤后的记录进行任何计算,则必须将列传递给udf