package org.openflamingo.mapreduce.etl.statics;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.openflamingo.mapreduce.core.Delimiter;
import org.openflamingo.mapreduce.etl.statics.statics.Statics;
import org.openflamingo.mapreduce.etl.statics.statics.StaticsModule;
import org.openflamingo.mapreduce.etl.statics.statics.StaticsModuleRegistry;
import org.openflamingo.mapreduce.parser.CsvRowParser;
import org.openflamingo.mapreduce.util.StringUtils;
import java.io.IOException;
/**
* Created by IntelliJ IDEA.
* User: ell
* Date: 12. 1. 24
* Time: 오후 10:51
* To change this template use File | Settings | File Templates.
*/
public class StaticsReducer extends Reducer<NullWritable, Text, NullWritable, Text> {
/**
* 출력 파일의 구분자.
*/
private String delimiter;
private int columnLength;
private String[] dataTypes;
private StaticsModule[] modules;
private long lineCount;
@Override
protected void setup(Context context) throws IOException, InterruptedException {
Configuration configuration = context.getConfiguration();
delimiter = configuration.get("outputDelimiter", Delimiter.COMMA.getDelimiter());
columnLength = configuration.getInt("columnsToStaticsLength", -1);
lineCount = configuration.getLong("lineCount", -1);
dataTypes = StringUtils.commaDelimitedListToStringArray(configuration.get("dataTypes"));
String[] staticsModes = StringUtils.commaDelimitedListToStringArray(configuration.get("staticsModes"));
if (staticsModes.length != columnLength &&
dataTypes.length != columnLength) {
throw new IllegalArgumentException("Invalid Parameter Length");
}
modules = new StaticsModule[columnLength];
for (int i = 0; i < columnLength; i++) {
modules[i] = StaticsModuleRegistry.getModule(Statics.valueOf(staticsModes[i]));
modules[i].setDataType(dataTypes[i]);
modules[i].setCount(lineCount);
}
}
@Override
protected void reduce(NullWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
// FIXME messy over all
CsvRowParser parser = new CsvRowParser();
parser.setInputDelimiter(delimiter);
for (Text value : values) {
parser.parse(value.toString());
for (int i = 0; i < columnLength; i++) {
// TODO SUM ETL에서 계산한 값을 최종적으로 더해줌
modules[i].calculate(parser.get(i));
}
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < columnLength; i++) {
builder.append(modules[i].toString()).append(delimiter);
}
String result = builder.substring(0, builder.length() - delimiter.length());
context.write(NullWritable.get(), new Text(result));
}
}