使用spark,我正在解析csv文件,其中每一行代表应用程序用户进行的调用。解析之后,我得到了JavaRDD对象,它通常包含一个用户的多个条目。
现在我想要实现的是总结每个用户的总通话时间。我跟着其他地方给出的单词计数示例,它也适用于我的情况,但是,我不确定这是不是正确的方法,因为我必须将每个解析的对象映射到一个单独的密钥。
我写的代码粘贴在下面,但是,我不确定这是否正确。
JavaRDD < Subscriber > cdrs = textFile.flatMap(new FlatMapFunction < String, Subscriber > () {
public Iterable < Subscriber > call(String line) {
List < Subscriber > list = new ArrayList < Subscriber > ();
String[] fields = line.split(",");
if (fields != null && fields[0].trim().matches("[0-9]+")) {
Subscriber subscriber = new Subscriber();
subscriber.setMsisdn(fields[0].trim());
subscriber.setDuration(Double.parseDouble(fields[5].replaceAll("s", "")));
list.add(subscriber);
}
return list;
}
});
JavaPairRDD < String, Subscriber > counts = words.mapToPair(new PairFunction < Subscriber, String, Subscriber > () {
public Tuple2 < String, Subscriber > call(Subscriber s) {
return new Tuple2 < String, Subscriber > (s.getMsisdn(), s);
}
}).reduceByKey(new Function2 < Subscriber, Subscriber, Subscriber > () {
@Override
public Subscriber call(Subscriber v1, Subscriber v2) throws Exception {
v1.setDuration(v1.getDuration() + v2.getDuration());
return v1;
}
});
答案 0 :(得分:0)
我使用spark数据框编写以下伪代码(python-spark使用spark 2.0):
df = spark.read.format("csv").option("header", "true").load("csv_file.csv")
new_df = df.groupBy("username").agg(sum("talk_time").alias("total_talk_time");
第一行 - 将CSV加载到数据框中(有关详细信息,请参阅我的答案https://stackoverflow.com/a/37640154/5088142)
第二行 - 按用户名栏分组,并对列&#34; talk_time&#34;
的汇总数据执行sum()函数 关于groupby / agg的新数据框应该包含&#34;用户名&#34;列,&#34; total_talk_time&#34;列 - 将保存您要查找的数据。
您必须稍微修改它才能将其作为Java-spark执行...