我有如下数据集:
Input Dataset
Id, Parent_id, Data
-----------------------
1, NULL, favorite: 3
2, NULL, favorite: 4
Output Dataset
Id, Parent_Id, Data
------------------------
1, NULL, favorite: 3
1_t1, 1, favorite: 3
1_t2, 1, favorite: 3
1_t3, 1, favorite: 3
2, NULL, favorite: 4
2_t1, 2, favorite: 4
2_t2, 2, favorite: 4
2_t3, 2, favorite: 4
2_t4, 2, favorite: 4
正如您在上面看到的那样,我正在尝试将数据列收藏夹计数属性分解为它们自己的单独行,并使用parent_id列表示其根记录。
到目前为止,我v尝试使用Spark SQL Explode函数尝试执行此操作,但是我无法使其正常运行。
答案 0 :(得分:1)
如果我正确理解了您的问题,则您尝试使用数据列中的数字从现有行中生成/创建新行,并希望使用新的id
和{ {1}}指向原始记录
如果是这种情况,则可以使用parent_id
和map
操作,如下所示:
flatMap
结果将是:
import org.apache.spark.sql.Row
import scala.collection.mutable.ArrayBuffer
import sparkSession.sqlContext.implicits._
val input = Seq(("1", "NULL", "favorite:3"), ("2", "NULL", "favorite:4")).toDF("id", "parent_id", "data")
input.printSchema()
input.show(false)
val resultRDD = input.rdd.map(row => {
val list = new ArrayBuffer[Row]()
list += row
val pointer = row.getAs[String]("data").split(":")(1).toInt
for (index <- 1 to pointer) {
val newId = s"${row.getAs[String]("id")}_t$index"
list += Row.fromSeq(Seq(newId, row.getAs[String]("id"), row.getAs[String]("data")))
}
list
}).flatMap(_.toIterator)
val resultDF = sparkSession.createDataFrame(resultRDD, input.schema)
resultDF.show(false)