JavaRDD之后的Arraylist为空<;字符串>;。火花中的火花
示例json(共100条记录): {“姓名”:“开发人员”,“工资”:10000,“职业”:“工程师”,“地址”:“诺伊达”} {“姓名”:“karthik”,“工资”:20000,“职业”:“Eng”,“地址”:“noida”} 有用代码:JavaRDD之后的Arraylist为空<;字符串>;。火花中的火花,java,apache-spark,java-7,anonymous-function,Java,Apache Spark,Java 7,Anonymous Function,示例json(共100条记录): {“姓名”:“开发人员”,“工资”:10000,“职业”:“工程师”,“地址”:“诺伊达”} {“姓名”:“karthik”,“工资”:20000,“职业”:“Eng”,“地址”:“noida”} 有用代码: final List<Map<String,String>> jsonData = new ArrayList<>(); DataFrame df = sqlContext.read().json("fi
final List<Map<String,String>> jsonData = new ArrayList<>();
DataFrame df = sqlContext.read().json("file:///home/dev/data-json/emp.json");
JavaRDD<String> rdd = df.repartition(1).toJSON().toJavaRDD();
rdd.foreach(new VoidFunction<String>() {
@Override
public void call(String line) {
try {
jsonData.add (new ObjectMapper().readValue(line, Map.class));
System.out.println(Thread.currentThread().getName());
System.out.println("List size: "+jsonData.size());
} catch (IOException e) {
e.printStackTrace();
}
}
});
System.out.println(Thread.currentThread().getName());
System.out.println("List size: "+jsonData.size());
我已经测试过了,效果很好
final ObjectMapper ObjectMapper=new ObjectMapper();
列表=rdd
.map(新org.apache.spark.api.java.function.function(){
@凌驾
公共映射调用(字符串行)引发异常{
TypeReference typeRef=新的TypeReference(){
};
Map rs=objectMapper.readValue(行,typeRef);
返回rs;
}
}).收集();
我更喜欢映射
Map
,因为这将处理Json中值部分不是字符串的情况(即“salary”:20000
) 由于列表一开始似乎是空的,可能是对象映射程序无法解析它得到的行吗?您能否提供一个?什么是rdd
?可能是在foreach完成其任务(甚至启动)之前执行系统.out.println
?final关键字与处理后列表为空无关。它只是告诉编译器不应再次初始化此变量/字段。如果您的列表为空,则不会发生添加调用。请使用调试器逐步完成此操作。我打赌答案会跳出来。问题被标记为java-7
。Java 8代码不太可能有帮助。@freedev感谢您的努力。我试过了,但是在线程“main”org.apache.spark.sparkeexception中得到了异常:任务不能在org.apache.spark.util.ClosureCleaner$.ensureSerializable上序列化(ClosureCleaner.scala:304)
即使在将implements Serializable
添加到运行main Method的主类之后,我也在这里尝试了这段代码,效果非常好。在匿名函数外部创建typeRef
会产生问题。换了衣服后它就工作了。谢谢你的帮助。
Executor task launch worker-1
List size: 1
Executor task launch worker-1
List size: 2
Executor task launch worker-1
List size: 3
.
.
.
Executor task launch worker-1
List size: 100
main
List size: 0
final ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, Object>> list = rdd
.map(new org.apache.spark.api.java.function.Function<String, Map<String, Object>>() {
@Override
public Map<String, Object> call(String line) throws Exception {
TypeReference<Map<String, Object>> typeRef = new TypeReference<Map<String, Object>>() {
};
Map<String, Object> rs = objectMapper.readValue(line, typeRef);
return rs;
}
}).collect();