【问题标题】:Spark - How to convert map function output (Row,Row) tuple to one DataframeSpark - 如何将地图函数输出(行,行)元组转换为一个数据帧
【发布时间】:2017-11-14 03:13:35
【问题描述】:

我需要使用 Scala API 在 Spark 中编写一个场景。 我将一个用户定义的函数传递给一个数据帧,该数据帧一个接一个地处理数据帧的每一行并返回元组(行,行)。如何将 RDD ( Row, Row) 更改为 Dataframe (Row)?请参阅下面的代码示例 -

**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 或 Dataframe 的 1 条记录,使其成为 RDD 或 Dataframe RDD(行)。感谢您的帮助。

【问题讨论】:

  • 您希望如何组合两个 Row 元素?是否应该将第二个列附加到第一个列?两行中可能存在共同的列吗?没有这些信息,问题就不清楚了。

标签: scala apache-spark apache-spark-sql


【解决方案1】:

您可以使用flatMap 来展平您的 Row 元组,假设我们从这个示例开始 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|
+---+---+

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 2016-12-04
    • 2020-08-12
    • 2018-02-08
    相关资源
    最近更新 更多