我有一个带架构的大数据框
现在我需要根据(event_start_date_time,service_key)将这个大数据帧转换为多个数据帧,然后将多个数据帧保存在List中,以便我可以在List中使用它们
大数据帧有30个不同(event_start_date_time,service_key)
我需要一个包含event_start_date_time ='2018-03-05T11:00:00Z'和service_key ='1234'的记录的小型dataframe_1
我需要一个包含event_start_date_time ='2018-03-06T11:00:00Z'和service_key ='1235'的记录的小型dataframe_2
...
我需要bigdataframe来列出[DataFrame] = List(dataframe_1,dataframe_2,dataframe_3,dataframe_4,... dataframe_30)
我需要小型数据帧,因为我的要求是对每个较小的数据帧进行更多转换,然后将结果存储为HDFS中每个较小数据帧的文件
目前我正在做的是我编写的代码给了我唯一的列表(event_start_date_time,service_key),我循环使用List来应用相应的过滤器,但这花费了太多时间
我的代码:
val df = /* Big Dataframe creation logic*/
val uniqueContentList = getUniqueContents(df)
def getUniqueContents(df: DataFrame) : List[String] = {
df
.select("event_start_date_time","service_key")
.removeDuplicates()
.withColumn("unique_content",concat(df("event_start_date_time"),lit("_"),df("service_key"))).drop("event_start_date_time").drop("service_key")
.collect()
.map(row => row.getString(0))
.toList
.sorted
}
val dataframeMap = uniqueContentList.map(elem => consolidateProgramIntervals(df, elem))
val unionedDF = dataframeMap.reduce((df1, df2) => df1.unionAll(df2))
def consolidateProgramIntervals(df:DataFrame,uniqueContentKey:String) :DataFrame = {
log.info("consolidating ProgramIntervals for " + uniqueContentKey)
val arr = uniqueContentKey.split(("_"))
val eventStartDateTime = arr(0)
val serviceKey = arr(1)
val filteredDF = df
.filterByUniqueContent(eventStartDateTime,serviceKey)
filteredDF
}