我有以下目录结构:
/数据/ 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
}
这将有助于分别处理每个文件,并避免分组。
答案 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))