gpt4 book ai didi

java - 使用 Java 将 Spark DataFrame 中的数组转换为 DenseVector

转载 作者:行者123 更新时间:2023-12-02 01:51:27 27 4
gpt4 key购买 nike

我正在运行 Spark 2.3。我想将以下 DataFrame 中的列 featuresArrayType 转换为 DenseVector。我在 Java 中使用 Spark。

+---+--------------------+
| id| features|
+---+--------------------+
| 0|[4.191401, -1.793...|
| 10|[-0.5674514, -1.3...|
| 20|[0.735613, -0.026...|
| 30|[-0.030161237, 0....|
| 40|[-0.038345724, -0...|
+---+--------------------+

root
|-- id: integer (nullable = false)
|-- features: array (nullable = true)
| |-- element: float (containsNull = false)

我编写了以下UDF,但它似乎不起作用:

private static UDF1 toVector = new UDF1<Float[], Vector>() {

private static final long serialVersionUID = 1L;

@Override
public Vector call(Float[] t1) throws Exception {

double[] DoubleArray = new double[t1.length];
for (int i = 0 ; i < t1.length; i++)
{
DoubleArray[i] = (double) t1[i];
}
Vector vector = (org.apache.spark.mllib.linalg.Vector) Vectors.dense(DoubleArray);
return vector;
}
}

我希望提取以下特征作为 vector ,以便我可以对其进行聚类。

我还注册了 UDF,然后继续调用它,如下所示:

spark.udf().register("toVector", (UserDefinedAggregateFunction) toVector);
df3 = df3.withColumn("featuresnew", callUDF("toVector", df3.col("feautres")));
df3.show();

运行此代码片段时,我遇到以下错误:

ReadProcessData$1 cannot be cast to org.apache.spark.sql.expressions. UserDefinedAggregateFunction

最佳答案

问题在于您如何注册 udf在斯帕克.您不应该使用UserDefinedAggregateFunction这不是 udf但是udaf用于聚合。相反,你应该做的是:

spark.udf().register("toVector", toVector, new VectorUDT());

然后要使用注册的函数,请使用:

df3.withColumn("featuresnew", callUDF("toVector",df3.col("feautres")));

udf本身应该稍微调整如下:

UDF1 toVector = new UDF1<Seq<Float>, Vector>(){

public Vector call(Seq<Float> t1) throws Exception {

List<Float> L = scala.collection.JavaConversions.seqAsJavaList(t1);
double[] DoubleArray = new double[t1.length()];
for (int i = 0 ; i < L.size(); i++) {
DoubleArray[i]=L.get(i);
}
return Vectors.dense(DoubleArray);
}
};
<小时/>

请注意,在 Spark 2.3+ 中,您可以创建 scala 样式 udf可以直接调用。从这里answer :

UserDefinedFunction toVector = udf(
(Seq<Float> array) -> /* udf code or method to call */, new VectorUDT()
);

df3.withColumn("featuresnew", toVector.apply(col("feautres")));

关于java - 使用 Java 将 Spark DataFrame 中的数组转换为 DenseVector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52927303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com