如何根据多个字段值的条件在spark数据框行上执行flatMap?

时间:2019-07-16 18:07:13

标签: scala apache-spark dataframe bigdata flatmap

我需要将现有数据框的现有行映射成多行。 例如,根据一行中的某些字段是否彼此相等/相等,我需要为该现有行创建x个行。

谢谢。

我正在做一些搜索并了解了爆炸的知识,但我认为它只能以1列作为输入,所以我想知道是否存在诸如Dataframe的平面图之类的东西,还是我需要将Dataframe转换为RDD并执行平面图并将其转换回DataFrame。

我已经尝试过使用.rdd将其设置为rdd,但它会导致行的RDD,我需要flatMap行->多行,但不确定如何做到这一点。

n / a

如果我有一行包含字段[a,b,c,d,e,f,g],则转换之一可能是a == c,则该行映射到2个新行,如果a! = c然后将行映射到6个新行。

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式进行操作:

import org.apache.spark.sql._
import spark.implicits._

val rows = List((10, 20, 30, 40, 50, 60, 70), (10, 20, 10, 40, 50, 60, 70))
val inDF = spark.sparkContext.parallelize(rows).toDF("a", "b", "c", "d", "e", "f", "g")
inDF.show()
//  +---+---+---+---+---+---+---+
//  |  a|  b|  c|  d|  e|  f|  g|
//  +---+---+---+---+---+---+---+
//  | 10| 20| 30| 40| 50| 60| 70|
//  | 10| 20| 10| 40| 50| 60| 70|
//  +---+---+---+---+---+---+---+

val outDF = inDF.sqlContext.createDataFrame(inDF.rdd.flatMap {
  case row if row.getInt(0) == row.get(2) => List(row, row)
  case row if row.getInt(0) != row.get(2) => List(row, row, row, row, row, row)
}, inDF.schema)
outDF.show()
//  +---+---+---+---+---+---+---+
//  |  a|  b|  c|  d|  e|  f|  g|
//  +---+---+---+---+---+---+---+
//  | 10| 20| 30| 40| 50| 60| 70|
//  | 10| 20| 30| 40| 50| 60| 70|
//  | 10| 20| 30| 40| 50| 60| 70|
//  | 10| 20| 30| 40| 50| 60| 70|
//  | 10| 20| 30| 40| 50| 60| 70|
//  | 10| 20| 30| 40| 50| 60| 70|
//  | 10| 20| 10| 40| 50| 60| 70|
//  | 10| 20| 10| 40| 50| 60| 70|
//  +---+---+---+---+---+---+---+

答案 1 :(得分:0)

我建议使用.toPands()函数制作一个熊猫数据框,并做任何您想做的事!