2016-10-25 6 views
1

シナリオ テキストファイルパス、List a、List bを含む2つの文字列リストがあります。 リストa、bのデカルト積にしてデカルトデータフレーム比較を実現したい。rdd操作でデータフレームを読み取る方法

私が試みている方法は、最初にデカルト製品である をpairRddに転送してから、foreach適用操作にかけます。

List<String> a = Lists.newList("/data/1.text",/data/2.text","/data/3.text"); 
List<String> b = Lists.newList("/data/4.text",/data/5.text","/data/6.text"); 

JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext()); 
List<Tuple2<String,String>> cartesian = cartesian(a,b); 
jsc.parallelizePairs(cartesian).filter(new Function<Tuple2<String, String>, Boolean>() { 
     @Override public Boolean call(Tuple2<String, String> tup) throws Exception { 
      Dataset<Row> text1 = spark.read().text(tup._1); <-- this throw NullPointerException 
      Dataset<Row> text2 = spark.read().text(tup._2); 
      return text1.first()==text2.first(); <-- this is an indicative function only 
     }); 

でも、私はこれを処理するための良いアプローチを提案してください

JavaRDD<Column> sourceRdd = jsc.parallelize(a); 
JavaRDD<Column> allRdd = jsc.parallelize(b); 

sourceRdd.cache().cartesian(allRdd).filter(new Function<Tuple2<String, String>, Boolean>() { 
     @Override public Boolean call(Tuple2<Column, Column> tup) throws Exception { 
      Dataset<Row> text1 = spark.read().text(tup._1); <-- same issue 
      Dataset<Row> text2 = spark.read().text(tup._2); 
      return text1.first()==text2.first(); 
     } 
    }); 

としてデカルトを行うために火花を使用することができます。

+0

「jsc.parallelizePairs(デカルト)」を行う理由はありません。 'cartesian'コレクションを直接反復する。 – maasg

答えて

0

あなたの問題を完全に理解しているかわかりません。 SparkとJavaを使用したCartesianのサンプルを以下に示します。

public class CartesianDemo { 
public static void main(String[] args) { 
    SparkConf conf = new SparkConf().setAppName("CartesianDemo").setMaster("local"); 
    JavaSparkContext jsc = new JavaSparkContext(conf); 
    //list 
    List<String> listOne = Arrays.asList("one", "two", "three", "four", "five"); 
    List<String> listTwo = Arrays.asList("ww", "xx", "yy", "zz"); 
    //RDD 
    JavaRDD<String> rddOne = jsc.parallelize(listOne); 
    JavaRDD<String> rddTwo = jsc.parallelize(listTwo); 
    //Cartesian 
    JavaPairRDD<String, String> cartesianRDD = rddOne.cartesian(rddTwo); 
    //print 
    cartesianRDD.foreach(data -> { 
     System.out.println("X=" + data._1() + " Y=" + data._2()); 
    }); 
    //stop 
    jsc.stop(); 
    jsc.close(); 
    } 
} 
+0

私はデカルトについて知っていましたが、私がすでにそれを例に入れていることに気づいた場合、この問題は、foreach関数内でsparkSession.read()を実行しています。 – rohit

+0

これは動作しませんし、NPEを投げます。あなたはSOで報告された同様の問題を見つけることができます。あなたはデカルトを取得するためにDataset.joinメソッドを使用することができますし、その上でフィルタを呼び出すことができます。 – abaghel

関連する問題