Scala 将WrappedArray的数据帧触发到数据帧[Vector]

Scala 将WrappedArray的数据帧触发到数据帧[Vector],scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我有一个spark数据帧df,具有以下模式: 根目录 |--特性:数组(nullable=true) ||--元素:双精度(containsnall=false) 我想创建一个新的数据帧,其中每一行都是Doubles的向量,并期望得到以下模式: 根目录 |--特征:向量(可空=真) 到目前为止,我有以下代码(受本文影响:),但我担心它有问题,因为计算合理数量的行需要很长时间。 此外,如果行太多,应用程序将因堆空间异常而崩溃 val clustSet=df.rdd.map(r=>{ val a

我有一个spark数据帧
df
,具有以下模式:

根目录
|--特性:数组(nullable=true)
||--元素:双精度(containsnall=false)
我想创建一个新的数据帧,其中每一行都是
Double
s的向量,并期望得到以下模式:

根目录
|--特征:向量(可空=真)
到目前为止,我有以下代码(受本文影响:),但我担心它有问题,因为计算合理数量的行需要很长时间。 此外,如果行太多,应用程序将因堆空间异常而崩溃

val clustSet=df.rdd.map(r=>{
val arr=r.getAs[mutable.WrappedArray[Double]](“特性”)
val特征:向量=向量。密集(arr.toArray)
特征
}).map(Tuple1()).toDF()
在这种情况下,我怀疑指令
arr.toArray
不是一个好的火花实践。任何澄清都会很有帮助


谢谢大家!

这是因为
.rdd
必须从内存中的内部格式取消序列化对象,而且非常耗时

可以使用
.toArray
-您在行级别上操作,而不是将所有内容收集到驱动程序节点

使用UDF可以很容易地做到这一点:

import org.apache.spark.ml.linalg._
val convertUDF = udf((array : Seq[Double]) => {
  Vectors.dense(array.toArray)
})
val withVector = dataset
  .withColumn("features", convertUDF('features))
代码来自此答案:


然而,问题的作者没有询问差异,因为rdd必须从内存中的内部格式取消序列化对象,而且非常耗时

可以使用
.toArray
-您在行级别上操作,而不是将所有内容收集到驱动程序节点

使用UDF可以很容易地做到这一点:

import org.apache.spark.ml.linalg._
val convertUDF = udf((array : Seq[Double]) => {
  Vectors.dense(array.toArray)
})
val withVector = dataset
  .withColumn("features", convertUDF('features))
代码来自此答案:


然而,问题的作者并没有询问差异

非常感谢,这帮了大忙,并将其标记为答案。我现在可以跑更多的行了,这在时间上是令人满意的。我仍然遇到一个异常:org.apache.spark.SparkException:Kryo序列化失败:缓冲区溢出。可用:0,当我尝试200000行时需要:1。你对此有什么见解吗?再次感谢。@user159941请检查我在我的代码中设置了以下内容:val conf=new SparkConf().set(“spark.serializer”、“org.apache.spark.serializer.KryoSerializer”).set(“spark.KryoSerializer.buffer.max.mb”、“256”),它成功了!谢谢,非常感谢,这帮了我很大的忙,并把它作为答案。我现在可以跑更多的行了,这在时间上是令人满意的。我仍然遇到一个异常:org.apache.spark.SparkException:Kryo序列化失败:缓冲区溢出。可用:0,当我尝试200000行时需要:1。你对此有什么见解吗?再次感谢。@user159941请检查我在我的代码中设置了以下内容:val conf=new SparkConf().set(“spark.serializer”、“org.apache.spark.serializer.KryoSerializer”).set(“spark.KryoSerializer.buffer.max.mb”、“256”),它成功了!非常感谢。