我必须计算特征。我逐一计算:
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")
联合操作只会附加另一个数据帧,因此它会更快,而且只是一个逻辑更改。