spark mergr共同列上的大量数据帧

时间:2016-07-22 03:34:52

标签: scala apache-spark spark-dataframe

我必须计算功能。我一个一个地计算它们:

dataframe1 = (id,feature1)
dataframe2 = (id,feature2)
dataframe3 = (id,feature3)
....

" ID"是主键。我希望得到如下结果:

dataframe = (id,feature1,feature2,...)

我不想使用"加入"多次。功能的数量大约是五十。 有没有简单的方法来实现它?

2 个答案:

答案 0 :(得分:1)

如果您将数据框存储在reduce中,则可以通过List惯用来表达:

val dfs = List(dataframe1,dataframe2,dataframe3)
dfs.reduce {(x,y) => x.join(y, "id")}
//org.apache.spark.sql.DataFrame = [id: int, feature1: int, feature2: int, feature3: int]

答案 1 :(得分:-1)

这可以通过对所有数据帧进行联合然后按键进行groupby来完成:

val dataframe = dataframe1.selectExpr("id", "concat('1###',feature1)")
  .unionAll(dataframe2.selectExpr("id", "concat('2###',feature2)"))
  .unionAll(dataframe3.selectExpr("id", "concat('3###',feature3)"))
  .rdd.groupBy(_.get(0))
  .map(data => {
    val tempData = data._2.map(x =>{
      val temp = x.getString(1).split("###")
      (temp(0),temp(1))
    }).toMap
    (data._1.toString,tempData.get("1"),tempData.get("2"),tempData.get("3"))
  }).toDF("id","feature1","feature2","feature3")

联合操作只会附加另一个数据帧,因此它会更快,只是一个逻辑上的变化。