java spark使用reducebykey aviod嵌套列表将对象连接到一个列表中

jdg4fx2g  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(442)

我有一个javasparkrdd,其(key,value)对为(string,arraylist)。arraylist是一个对象数组(可以是int、double、string、array或任何其他类型)。
e、 g.输入如下:

  1. key1, [R1_Entry_1, R1_Entry_2, ..., R1_Entry_n]
  2. key1, [R2_Entry_1, R2_Entry_2, ..., R2_Entry_n]
  3. key1, [R3_Entry_1, R3_Entry_2, ..., R3_Entry_n]
  4. key2, [R4_Entry_1, R4_Entry_2, ..., R4_Entry_n]
  5. ...
  6. keyJ, [RK_Entry_1, RK_Entry_2, ..., RK_Entry_n]
  7. ...
  8. keyX, [RM_Entry_1, RM_Entry_2, ..., RM_Entry_n]

那么 RI_entry_J (行i和条目j)是java.lang.object,可以是int、double、string、arraylist或任何其他类型。
我用过 JavaRDD.reduceByKey() ,以减少新列表中的条目。我期望的输出应该是(假设 key1 只有三个对应的行(前三行:r1、r2、r3)

  1. key1, [[R1_Entry_1, R2_Entry_1,R3_Entry_1], [R1_Entry_2, R2_Entry_2,R3_Entry_2], ..., [R1_Entry_n, R2_Entry_n,R3_Entry_n]]
  2. ...
  3. keyJ, [[RK_Entry_1, R*_Entry_1, ...], [RK_Entry_2, R*_Entry_2, ...], ..., [RK_Entry_n, R*_Entry_n, ...]]
  4. ...

我的代码如下:

  1. JavaPairRDD<String, ArrayList> AdjJavaRDD = JavaRDD.reduceByKey(new Function2<ArrayList, ArrayList, ArrayList>() {
  2. @Override
  3. public ArrayList call(ArrayList v1, ArrayList v2) throws Exception {
  4. int v1Len = v1.size();
  5. int v2Len = v2.size();
  6. if (v1Len != v2Len) {
  7. System.out.println(" \n The input size is incorrect. Please check! \n ");
  8. System.exit(0);
  9. }
  10. List<Object> obj = new ArrayList<Object>(v1Len);
  11. for (int i =0; i < v1Len; i++)
  12. {
  13. List<Object> obj_i = new ArrayList<>();
  14. Object v1i = v1.get(i);
  15. Object v2i = v2.get(i);
  16. obj_i.add(v1i);
  17. obj_i.add(v2i);
  18. obj.add(i, obj_i);
  19. }
  20. return new ArrayList(obj);
  21. }
  22. });

结果如下: key1, [[[R1_Entry_1, R2_Entry_1],R3_Entry_1], [[R1_Entry_2, R2_Entry_2],R3_Entry_2], ..., [[R1_Entry_n, R2_Entry_n],R3_Entry_n]] i、 条目嵌套在列表中,而不是写入没有嵌套的列表中。
exmaple如果 Entry_1 是整数,并且 KeyJ 有五行和五行相对应 Entry_1 作为 1, 2, 3,4, 5 . 的结果 KeyJ 使用我的代码是 KeyJ, [[[[[1,2],3], 4], 5], ...] (在实际计算中,整数的顺序是随机的)。霍弗,我想要的是 KeyJ, [[1, 2, 3, 4, 5], ...] 有没有办法避免java中spark代码中出现这种嵌套列表?

wb1gzix0

wb1gzix01#

我有办法。上述代码不起作用的原因是 Object v1i = v1.get(i); 将返回特定对象,例如。 v1i 作为 String (或任何其他数据类型)。但是,当它被调用之后, v1i 成为 ArrayList ,这就是问题中的代码返回嵌套列表的原因。
更新后的解决方案如下:

  1. JavaPairRDD<Tuple2, ArrayList> JavaRDDColumns = adjJavaRDD.reduceByKey(new Function2<ArrayList, ArrayList, ArrayList>() {
  2. @Override
  3. public ArrayList call(ArrayList v1, ArrayList v2) throws Exception {
  4. int v1Len = v1.size();
  5. int v2Len = v2.size();
  6. Object[] objArr = new Object[v1Len];
  7. for (int i = 0; i < v1Len; i++) {
  8. ArrayList<Object> obj_i = new ArrayList<Object>();
  9. Object obj1i = v1.get(i);
  10. Object obj2i = v2.get(i);
  11. List<Object> obj1Arr = new ArrayList<>();
  12. List<Object> obj2Arr = new ArrayList<>();
  13. if (obj1i instanceof List<?>) {
  14. obj1Arr = (List) obj1i;
  15. } else {
  16. obj1Arr = Arrays.asList(obj1i); // not a Arraylist, convert to a Arraylist
  17. }
  18. if (obj2i instanceof List<?>) {
  19. obj2Arr = (List) obj2i;
  20. } else {
  21. obj2Arr = Arrays.asList(obj2i);
  22. }
  23. List<Object> combineList = ListUtils.union(obj1Arr, obj2Arr);
  24. objArr[i] = combineList;
  25. }
  26. ArrayList<Object> obj = new ArrayList<>(Arrays.asList(objArr));
  27. return obj;
  28. }
  29. });
展开查看全部

相关问题