Spark get value form WrappedArray<WrappedArray<Double>> in UDF Java
我的
如何在这种嵌套结构中访问Doubles?
我想做这样的事情:
1 | sparkSession.udf().register(ADD_START_TOTAL, (UDF1<WrappedArray<WrappedArray<Double>>, Double>) (totals) -> totals[0][1], DataTypes.DoubleType); |
这是当我调用
1 | [WrappedArray(2.0... |
编辑:找到了这篇文章如何在火花(scala)中将WrappedArray [WrappedArray [Float]]转换为Array [Array [Float]]
但不确定如何将其转换为Java。
考虑您的
1 2 3 4 | root |-- value: array (nullable = true) | |-- element: array (containsNull = true) | | |-- element: double (containsNull = false) |
定义您的
1 2 3 4 5 6 7 8 9 | static UDF1<WrappedArray<WrappedArray<Double>>, List<Double>> getValue = new UDF1<WrappedArray<WrappedArray<Double>>, List<Double>>() { public List<Double> call(WrappedArray<WrappedArray<Double>> data) throws Exception { List<Double> doubleList = new ArrayList<Double>(); for(int i=0; i<data.size(); i++){ doubleList.addAll(JavaConversions.seqAsJavaList(data.apply(i))); } return doubleList; } } |
现在注册和调用
1 2 3 4 5 6 7 8 9 10 | import static org.apache.spark.sql.functions.col; import static org.apache.spark.sql.functions.callUDF; import scala.collection.JavaConversions; // register UDF spark.udf().register("getValue", getValue, DataTypes.createArrayType(DataTypes.DoubleType)); // Call UDF Dataset<Row> ds2 = ds1.select(col("*"), callUDF("getValue", col("value")).as("udf-value")); ds2.show(false); |