Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaRDD之后的Arraylist为空<;字符串>;。火花中的火花_Java_Apache Spark_Java 7_Anonymous Function - Fatal编程技术网

JavaRDD之后的Arraylist为空<;字符串>;。火花中的火花

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

示例json(共100条记录):

{“姓名”:“开发人员”,“工资”:10000,“职业”:“工程师”,“地址”:“诺伊达”} {“姓名”:“karthik”,“工资”:20000,“职业”:“Eng”,“地址”:“noida”}

有用代码:

   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();