Spark - 在数据集的几列上应用UDF并形成新列

时间:2017-10-25 06:27:25

标签: apache-spark rdd apache-spark-dataset

我有一个String类型的数据集,我想在这个数据集的某些列上应用一个函数,并根据列将它们转换为Long或Double或Int等,并附加新列(甚至是这些列的元组)列)到同一个数据集。有人可以建议正确的方法吗?

更新:

以下失败:

ds.withColumn("newCol", Vectors.dense(strDoubleUDF(ds("col10")) + str2DoubleUDF(ds("col12")))

错误

<console>:253: error: overloaded method value dense with alternatives:
  (values: Array[Double])org.apache.spark.mllib.linalg.Vector <and>
  (firstValue: Double,otherValues: Double*)org.apache.spark.mllib.linalg.Vector
 cannot be applied to (org.apache.spark.sql.Column, org.apache.spark.sql.Column)
                         Vectors.dense(str2DoubleUDF(ds("col10")),

2 个答案:

答案 0 :(得分:0)

这里有一个如何实现这个目的的例子:

val ds: Dataset[(String, String)] = Seq(
  ("1.0","1"),
  ("2.0","2"),
  ("3.0","3"),
  ("4.0","4")
).toDS()


val newDs: Dataset[(String, String, (Double, Int))] = ds
  .map{case (doubleStr,intStr) =>
  (doubleStr,
    intStr,
    (doubleStr.toDouble,intStr.toInt) // new struct/tuple column 
  )
}

答案 1 :(得分:0)

没有内置支持制作Vectors,所以你应该使用UDF:

val vectorUDF = udf ((col1 : Seq[Double], col2 : Seq[Double]) => {
    Vectors.dense(col1 + col2)
});
ds.withColumn("newCol", vectorUDF(strDoubleUDF(ds("col10")), str2DoubleUDF(ds("col12")))