解析CSV并聚合相同的记录

时间:2016-11-13 13:22:56

标签: java apache-spark

使用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;
 }
});

1 个答案:

答案 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的

信息可以在这里找到:http://spark.apache.org/docs/latest/sql-programming-guide.html#dataframegroupby-retains-grouping-columns

新数据框应该包含&#34;用户名&#34;列,&#34; total_talk_time&#34;列 - 将保存您要查找的数据。

您必须稍微修改它才能将其作为Java-spark执行...