Scala 如何在mapPartitions内部的org.apache.spark.sql.Row中添加列
我是scala和spark的新手,请记住:) 事实上,我有三个问题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],因此在您的例子中,您应该使用类似
提前感谢您通常不需要,最好使用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中的行添加新列。