* Преобразование scala Flatten для использования в Java в Spark - PullRequest
1 голос
/ 02 марта 2020

Я застрял в реализации Function1 в Java для UDF, чтобы сгладить схему Seq[Map[String,Int]]

Scala Code :  UDF1 joinMap = udf { values: Seq[Map[String,Int]] => values.flatten.toMap }

spark DF

root
 |-- rid: integer (nullable = true)
 |-- lid: integer (nullable = true)
 |-- mapArray: array (nullable = true)
 |    |-- element: map (containsNull = true)
 |    |    |-- key: double
 |    |    |-- value: integer (valueContainsNull = true)

Как реализовать аналогичный UDF в Java.

Java код:

 UDF1 mode1 = new UDF1<WrappedArray<Map<Double, Integer>>, String>() {
  @Override
  public String call(WrappedArray<Map<Double, Integer>> maps) throws Exception {

    List<Map<Double, Integer>> lis = (List<Map<Double, Integer>>) JavaConverters.seqAsJavaListConverter(maps).asJava();

    System.out.println(lis.get(1));

    java.util.Map<Double,Integer> a= lis.stream().flatMap(map -> map.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    return "";
  }


};
error : Caused by: java.lang.ClassCastException: scala.collection.immutable.Map$Map1 cannot be cast to java.util.Map
  at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:269)

1 Ответ

0 голосов
/ 04 марта 2020

При преобразовании преобразователей Seq [T] в List [T] Java будет преобразован только список Seq в Java, но не объекты объектов, совместимых с Seq в Java. То есть явно каждый объект Преобразованного Java списка (Seq) также должен быть преобразован в Java совместимый объект.

В указанном выше случае scala .collection.immutable.Map to java. util.Map.

import scala.collection.JavaConverters;
import scala.collection.JavaConversions;

UDF1 mode1 = new UDF1<WrappedArray<scala.collection.immutable.Map<Double, Integer>>, Map<Double, Integer>>() {
        @Override
        public Map<Double, Integer> call(WrappedArray<scala.collection.immutable.Map<Double, Integer>> maps) throws Exception {
            List<scala.collection.immutable.Map<Double, Integer>> lis = JavaConverters.seqAsJavaListConverter(maps).asJava();
            Map<Double, Integer> flattenMap = new HashMap<>();
            lis.forEach(map -> {
                Map<Double, Integer> m = JavaConversions.mapAsJavaMap((scala.collection.immutable.Map) map);
                flattenMap.putAll(m);
            });
            return flattenMap;
        }
    };

Этот код имеет предупреждение о непроверенном назначении, которое можно исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...