Spark在UDF Java中从WrappedArray <WrappedArray <Double >>获取值形式

Spark get value form WrappedArray<WrappedArray<Double>> in UDF Java

我的Dataset<Row>中有一列包含WrappedArray<WrappedArray<Double>>。我将此列传递给UDF以拉出其中一个值。

如何在这种嵌套结构中访问Doubles?

我想做这样的事情:

1
sparkSession.udf().register(ADD_START_TOTAL, (UDF1<WrappedArray<WrappedArray<Double>>, Double>) (totals) -> totals[0][1], DataTypes.DoubleType);

这是当我调用Dataset.show()方法时我的数据集如下所示的列的示例。

1
[WrappedArray(2.0...

编辑:找到了这篇文章如何在火花(scala)中将WrappedArray [WrappedArray [Float]]转换为Array [Array [Float]]
但不确定如何将其转换为Java。


考虑您的Dataset<Row> ds1具有value列并具有以下架构

1
2
3
4
root
 |-- value: array (nullable = true)
 |    |-- element: array (containsNull = true)
 |    |    |-- element: double (containsNull = false)

定义您的UDF1函数,如下所示。

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;
    }
}

现在注册和调用UDF1函数,如下所示。

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