Scala 将WrappedArray的数据帧触发到数据帧[Vector]
我有一个spark数据帧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
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”),它成功了!非常感谢。