在单个spark提交作业中单独处理多个文件

时间:2017-07-17 09:00:15

标签: scala apache-spark dataframe apache-spark-sql rdd

我有以下目录结构:

/数据/ MODELA

/数据/ modelB

/数据/ modelC ..

这些文件中的每一个都有格式化的数据(id,得分),我必须单独为它们做以下操作 -

1)按分数分组并按降序对分数进行排序(DF_1:分数,计数)

来自DF_1的

2)计算每个排序分组的累积频率(DF_2:得分,计数,cumFreq)

3)来自DF_2选择5-10之间的累积频率(DF_3:得分,cumFreq)

4)从DF_3中选择最低分(DF_4:分数)

5)从文件中选择DF_4中得分大于得分的所有id并保存

我可以通过将目录读取为wholeTextFile并为所有模型创建公共数据框来实现此目的,然后在模型上使用group by。

我想做 -

val scores_file = sc.wholeTextFiles("/data/*/")
val scores = scores_file.map{ line => 
  //step 1
  //step 2
  //step 3 
  //step 4
  //step 5 : save as line._1
}   

这将有助于分别处理每个文件,并避免分组。

1 个答案:

答案 0 :(得分:0)

假设您的模型是离散值,并且您知道,那么您可以将所有模型定义到列表中

val model = List("modelA", "modelB", "modelC", ... )

您可以采用以下方法:

model.forEach( model => {
  val scoresPerModel = sc.textFile(model);
  scoresPerModel.map { line => 
    // business logic here
  } 
})

如果您在计算必须使用Hadoop文件系统API读取的业务逻辑之前不知道该模型,并从那里提取模型。

private val fs = {
    val conf = new org.apache.hadoop.conf.Configuration()
    FileSystem.get(conf)
  }
fs.listFiles(new Path(hdfsPath))