一般来说,spark输出到HDFS的代码如下:
saveAsHadoopFile(outputPath,NullWritable.class, String.class,ManyFileFormat.class);
输出文件到目录outputPath下,只有一层,RDD的分区数多少输出文件数量也就多少,输出前也可以按照需要控制一下分区数(repartition(xx))进而控制输出文件数
现在需要安装自定义输出文件,也就是自定义在outputPath按多个层次多个维度输出分类后的数据.该如何处理呢?看看
saveAsHadoopFile方法,第3个参数是输出对象的类型,第4个参数是输出数据到文件的格式处理
所以我们要如下处理:
第一步定义数据类
public class TestBean implements Serializable {
private String data;
private String path;
private String str;
private String stime;
@Override
public String toString() {
return data.toString();
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public String getStime() {
return stime;
}
public void setStime(String stime) {
this.stime = stime;
}
}
然后是对数据处理,就是最终需要保存的数据变成如下格式:JavaPairRDD<String, TestBean>,
然后定义一个类作为spark输出到HDFS的处理
public class TestFormat<A, B>
extends MultipleTextOutputFormat<A, B> {
protected String generateFileNameForKeyValue(A key, B value, String name) {
TestBean lb = (TestBean)value;
return new StringBuffer(lb.getPath()).append('/')
.append(lb.getStr()).append('/').append(lb.getStime()).append(".txt").toString();
}
}
最后输出如下
.saveAsHadoopFile(outputPath, NullWritable.class, TestBean.class,TestFormat.class);
搞定输出路径格式如下:
outputPath/{str}/{stime}.txt