我有一个数据集,其案例类如下:
case class Rrow(p: Array[String], o: Array[String], l: Int, tl: Int, ap: Array[String], m: Array[String])
我需要将给定的数据集转换为另一个给定模式的数据集/数据框。
val schema = StructType(schemaFields.map(fieldName => StructField(fieldName, if (mvp.contains(fieldName)) ArrayType(StringType) else StringType, true)))
此处,schemaFields
是列名列表。
我使用以下代码为给定架构创建数据帧,但我必须使用RDD来创建数据帧。有没有什么有效的方法可以用来为给定的模式创建数据集/数据帧。
def getRow(p: Array[String], o: Array[String], l: Int, size: Int, ap: Array[String], m: Array[String]): Row = {
var columnArray = new Array[Any](size)
for (i <- 0 to (l - 1)) {
val index = ap.indexOf(p(i))
if (m.contains(p(i))) {
columnArray.update(index, o(i)).split(","))
} else {
columnArray.update(index, o(i)).toString())
}
}
Row.fromSeq(columnArray)
}
val rowRDD = ds
.rdd
.map(r => getRow(r.p, r.o, r.l, r.tl, r.ap, r.m))
val df = spark.createDataFrame(rowRDD, schema)