我有一个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")),
答案 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")))