我必须计算功能。我一个一个地计算它们:
dataframe1 = (id,feature1)
dataframe2 = (id,feature2)
dataframe3 = (id,feature3)
....
" ID"是主键。我希望得到如下结果:
dataframe = (id,feature1,feature2,...)
我不想使用"加入"多次。功能的数量大约是五十。 有没有简单的方法来实现它?
答案 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")
联合操作只会附加另一个数据帧,因此它会更快,只是一个逻辑上的变化。