シナリオ テキストファイルパス、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();
}
});
としてデカルトを行うために火花を使用することができます。
「jsc.parallelizePairs(デカルト)」を行う理由はありません。 'cartesian'コレクションを直接反復する。 – maasg