2017-12-16 7 views
1

まあ、私は4列、ID、ユーザ、データ(文字列)と日付を持つtsvファイルを持っています。私がしたいのは、ユーザー、データ、日付を最短のデータから取得することです。だから私はこれを試みます。それとSparkとJava 8でいくつかのカラムを取得してフィルタリングします

 JavaSparkContext sparkContext = new JavaSparkContext(sparkConf); 

     JavaRDD<String> lines = sparkContext 
      .textFile(args[0]); 

     JavaRDD<String> messages = lines 
      .map(line -> line.split("\t+")[2]); 
     JavaPairRDD<String, Integer> ones = messages 
      .mapToPair(string -> new Tuple2<>(string,string.length())); 
     JavaPairRDD<Integer, String> reverse = ones 
      .mapToPair(tuple -> new Tuple2<>(tuple._2, tuple._1)); 
     JavaPairRDD<Integer, String> sorted = reverse 
      .sortByKey(true) 
      .cache(); 

     List<Tuple2<Integer, String>> output = sorted 
      .take(1); 

、私は最短データと彼の長さが、今、私は、ユーザーと日付にこれを関連付けることができる方法を持っています?私はそれをする方法を知らない...任意のアイデア?

答えて

1

Tuple2を使用してペアrddを作成している間は、レコード全体を2番目のフィールドとして保存できます。ペアRddで、キーの長さを列のdataとし、値をレコード全体にします。その後、sortByKeyを実行した後、rddのペアはキー(列データの長さ)に基づいてソートされます。値には、レコード全体が存在します。これはtuple._2でアクセスし、区切り文字で分割してそこから必要な値を使用します。以下のようなもの :

JavaSparkContext sparkContext = new JavaSparkContext(sparkConf); 

JavaRDD<String> lines = sparkContext 
      .textFile(args[0]); 

JavaPairRDD<Integer,String> pairedRdd = lines.mapToPair(lines -> new Tuple2((lines.split("\t+")[2]).length(), lines)); 

     JavaPairRDD<Integer, String> sortedRdd = pairedRdd.sortByKey(true); 

     List<Tuple2<Integer, String>> output = sortedRdd.take(1); 

     System.out.println(output.get(0)._1+" "+output.get(0)._2); 

output.get(0)._2はレコード全体、\t+とのスプリットを持っています。配列から、必要な要素を取得します。

関連する問題