我需要使用 Scala API 在 Spark 中编写一个场景。我正在将一个用户定义的函数传递给一个数据帧,该数据帧逐一处理数据帧的每一行并返回元组(行,行)。如何将RDD(行,行)更改为数据帧(行)?请参阅下面的代码示例 -
**Calling map function-**
val df_temp = df_outPut.map { x => AddUDF.add(x,date1,date2)}
**UDF definition.**
def add(x: Row,dates: String*): (Row,Row) = {
......................
........................
var result1,result2:Row = Row()
..........
return (result1,result2)
现在df_temp是一个RDD(Row1,Row2)。 我的要求是通过将元组元素分解为 RDD 或数据帧的 1 条记录来使其成为一个 RDD 或数据帧RDD(行)。感谢您的帮助。
您可以使用
flatMap
来展平您的行元组,例如如果我们从此示例 rdd 开始:
rddExample.collect()
// res37: Array[(org.apache.spark.sql.Row, org.apache.spark.sql.Row)] = Array(([1,2],[3,4]), ([2,1],[4,2]))
val flatRdd = rddExample.flatMap{ case (x, y) => List(x, y) }
// flatRdd: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[45] at flatMap at <console>:35
将其转换为数据框。
import org.apache.spark.sql.types.{StructType, StructField, IntegerType}
val schema = StructType(StructField("x", IntegerType, true)::
StructField("y", IntegerType, true)::Nil)
val df = sqlContext.createDataFrame(flatRdd, schema)
df.show
+---+---+
| x| y|
+---+---+
| 1| 2|
| 3| 4|
| 2| 1|
| 4| 2|
+---+---+