如何根据大数据帧中的列将大数据帧拆分为较小的数据帧spark sql

时间:2018-03-12 15:29:00

标签: apache-spark apache-spark-sql

我有一个带架构的大数据框

现在我需要根据(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 


  }

0 个答案:

没有答案