在scala中使用reduceByKey和case

时间:2017-05-14 15:30:16

标签: scala mapreduce case reduce bigdata

我有这种类型;

 column1 column2 int 
 ((a,b),1)
 ((a,c),1)
 ((k,a),1)

我需要两种类型的结果,首先是所有column2的第1列

(a,total)

其次column1参数不等于column2参数

(a,total)

我如何使用ReduceByKey这种类型?

我的代码:

var data = sc.textFile("tttt.tsv")
var satir = data.map(line=> ((line.split("\t")(1).toString,line.split("\t")(2).toString),1))

---关于第二个场景

我的数据类型示例是

column1 column2 int
a b,1 
a c,1
a a,1
a d,1

我需要reduceByKey for column1在第二个场景中不等于column1

例如,我的示例数据结果=(a,b,1)+(a,c,1)+(a,d,1)= 3

2 个答案:

答案 0 :(得分:0)

对于First Scenario,您可以使用此方案。

val arrangedDF = satir.map(pairData => (pairData._1._1, (pairData._1._2, 1)))
val result1DF = arrangedDF.reduceByKey((x,y) => x._2 + y._2)

在这里,我重新排列了数据的表示,我将数据分开并将数据放入不同的元组中,您可以直接应用reduceByKey

对于Second Scenario,您可以使用此功能。

val result2DF = arrangedDF.filter( pairData => pairData._1 != pairData._2._1).reduceByKey((x,y) => x._2 + y._2)

这里针对第二个场景我重复使用arrangedDF并对其应用过滤器以获取您想要的条件,即column1参数不等于column2参数,然后应用reduceByKey

希望我的回答很清楚

由于

答案 1 :(得分:0)

如果我理解你的问题,下面是获得你所要求的一种方式:

public class SubCategoryChild_Response {
@SerializedName("status")
@Expose
private String status;
@SerializedName("merchant")
@Expose
private List<SubCategoryChild> subCategoryChildList = null;

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public List<SubCategoryChild> getSubCategoryChild() {
    return subCategoryChildList;
}

public void setSubCategoryChildList(List<SubCategoryChild> subCategoryChildList) {
    this.subCategoryChildList = subCategoryChildList;
}
}