通常不需要这样做,最好使用 UDF,但您可以:
我应该如何定义函数以将其传递到 df.rdd.mapPartitions,如果我想创建带有少量附加列的新行
它应该采用 Iterator[Row] 并返回 Iterator[T] 所以在你的情况下你应该使用这样的东西
import org.apache.spark.sql.Row
def transformRows(iter: Iterator[Row]): Iterator[Row] = ???
如何在 Row 对象中添加几列(或创建一个新的)
有多种方法可以访问Row 值,包括Row.get* 方法、Row.toSeq 等。可以使用Row.apply、Row.fromSeq、Row.fromTuple 或RowFactory 创建新的Row。例如:
def transformRow(row: Row): Row = Row.fromSeq(row.toSeq ++ Array[Any](-1, 1))
如何从创建的 RDD 中创建 DataFrame
如果您有RDD[Row],您可以使用SQLContext.createDataFrame 并提供架构。
把这一切放在一起:
import org.apache.spark.sql.types.{IntegerType, StructField, StructType}
val df = sc.parallelize(Seq(
(1.0, 2.0), (0.0, -1.0),
(3.0, 4.0), (6.0, -2.3))).toDF("x", "y")
def transformRows(iter: Iterator[Row]): Iterator[Row] = iter.map(transformRow)
val newSchema = StructType(df.schema.fields ++ Array(
StructField("z", IntegerType, false), StructField("v", IntegerType, false)))
sqlContext.createDataFrame(df.rdd.mapPartitions(transformRows), newSchema).show
// +---+----+---+---+
// | x| y| z| v|
// +---+----+---+---+
// |1.0| 2.0| -1| 1|
// |0.0|-1.0| -1| 1|
// |3.0| 4.0| -1| 1|
// |6.0|-2.3| -1| 1|
// +---+----+---+---+