spark RowToCol 行转列 的例子
已有 2487 次阅读2017-7-25 15:48
|个人分类:spark
举个栗子 为什么要行转列
1.table-----------------------------------------------------------------------------------------------------------------
uid e1 e2 e3 e4 .................................e100
0 0 1 1 1 ................................. 1
....
其中 uid 为int ,e1---e100 都是 0或者1的int
需要统计 不同的uid ,不同e值为1的数量
result
uid sum(e1) sum(e2) sum(e3) sum(e4) ------sum(e100)
0 2 3 4 5 -------- 0
.......
解题思路
1.字段列名过多,可以会导致利用 groupby agg 手要写费,如果字段列 不规律就更加 恐怖。。
2.将行转列
变成
uid err value
0 e1 0
0 e2 1
0 e3 0
....
在利用 grougby agg 就很好解决了
3. 行转列代码
val DataSource :DataFrame
val rowNameList:List
val RowToCol=DataSource.map{ line =>
val row=line
var listData=List[(Int,Int,Int)]()
for(i<- 0 until row.length-2){
listData::=(row.getInt(0),rowNameList(i),row.getInt(i+1))
}
listData
}.flatMap(x=>x).toDF("uid","err","value")