spark-merger在一个公共列上生成大量数据帧



我必须计算特征。我逐一计算:

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

"id"是主键。我想得到这样的结果:

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

我不想多次使用"加入"。特征的数量大约为五十个。有什么简单的方法可以实现吗?

如果将数据帧存储在List:中,则可以将其惯用地表示为reduce

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]

这件事可以通过对所有数据帧进行并集,然后对密钥进行分组来完成,如下所示:

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")

联合操作只会附加另一个数据帧,因此它会更快,而且只是一个逻辑更改。

相关内容

  • 没有找到相关文章

最新更新