Scala 如何在mapPartitions内部的org.apache.spark.sql.Row中添加列

Scala 如何在mapPartitions内部的org.apache.spark.sql.Row中添加列,scala,apache-spark,Scala,Apache Spark,我是scala和spark的新手,请记住:) 事实上,我有三个问题 如果我想创建包含少量附加列的新行,我应该如何定义将其传递到df.rdd.mapPartitions的函数 如何向行对象中添加几列(或创建一个新列) 如何从创建的RDD创建数据帧 提前感谢您通常不需要,最好使用UDF,但这里有: 如果我想创建包含少量附加列的新行,我应该如何定义将其传递到df.rdd.mapPartitions的函数 它应该采用Iterator[Row]并返回Iterator[T],因此在您的例子中,您应该使用类似

我是scala和spark的新手,请记住:)

事实上,我有三个问题

  • 如果我想创建包含少量附加列的新行,我应该如何定义将其传递到df.rdd.mapPartitions的函数
  • 如何向行对象中添加几列(或创建一个新列)
  • 如何从创建的RDD创建数据帧

  • 提前感谢您

    通常不需要,最好使用UDF,但这里有:

    如果我想创建包含少量附加列的新行,我应该如何定义将其传递到df.rdd.mapPartitions的函数

    它应该采用
    Iterator[Row]
    并返回
    Iterator[T]
    ,因此在您的例子中,您应该使用类似的方法

    import org.apache.spark.sql.Row
    
    def transformRows(iter: Iterator[Row]): Iterator[Row] = ???
    
    如何向行对象中添加几列(或创建一个新列)

    有多种访问
    值的方法,包括
    行.get*
    方法、
    行.toSeq
    等。可以使用
    行.apply
    行.fromSeq
    行.fromTuple
    行工厂
    创建新的
    。例如:

    def transformRow(row: Row): Row =  Row.fromSeq(row.toSeq ++ Array[Any](-1, 1))
    
    如何从创建的RDD创建数据帧

    如果您有
    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|
    // +---+----+---+---+
    

    请问你为什么需要这个?可能是一些示例代码/输入/输出。这是可能的,但通常有更好的方法。当然,我有两个不同的元素集,一个很大(以数据帧的形式),另一个很小,我在这两个元素集之间找到了一些最小值。我的想法是,我将较小的集合放入一些非常优化的结构中,将其传递到mapPartitions中,为每个项目计算一些值,并将它们“靠近”其他值。应该不需要
    mapPartitions
    。我喜欢scala代码的编写方式:)谢谢@更准确地说,AzatFazulzyanov:您喜欢zero323编写scala(/spark)代码的方式!v很好地使用了
    新闻模式
    。节省了我去重新设计的时间,这是如何用Java编写的?@zero323你能提供一个用Pyspark实现这一点的例子吗?我需要一个示例来向mapPartitions中的行添加新列。