我的输入是一些csv / tsv或任何用分隔符分隔的文件及其标题。我想将任何列映射为键,将整个行映射为值。我在机器上运行了以下代码,但是在纱线群集模式下测试失败。
public class SparkController implements java.io.Serializable {
String DELIMITER;
String[] header;
String path;
public static void main(String[] args) {
// some parse function
// say input file is a csv likes: (id,timestamp,ip)
// header = [ "id", "timestamp", "ip" ]
// DELIMITER = ","
SparkController sparkController = new SparkController();
sparkController.parseArgs(args);
JavaPariRDD<String, String> pairRdd = sparkController.map2PairRdd("ip");
}
private JavaPariRDD<String, String> map2PairRdd(String column) {
JavaRDD<String> rawFile = sc.textFile(path);
JavaPariRDD<String, String> pairRdd = rawFile.mapToPair((s) -> {
// DELIMITER can be accessed normally
String[] fields = s.split(DELIMITER);
// turns out header is empty when runs in yarn,
// but works fine in standalone mode
return new Tuple2<>(fields[header.indexOf("ip")], s);
});
// other operations continue
}
}
我了解到DELIMITER
和header
之类的变量在集群模式下被序列化为worker。但是数组header
在rdd操作中如何为空。
我通过在index
外部声明一个最终的int变量mapToPair
并在内部访问index
来修改代码,然后修复了该错误。
但是我仍然对为什么在header
内访问时mapToPair
为空的原因感到困惑。谁能提供一些见识?