如何在rdd操作中读取数据帧

时间:2016-10-25 02:56:32

标签: java apache-spark spark-dataframe cartesian-product

情景 我有两个字符串列表,包含文本文件路径,列表a,列表b。 我想对列表a,b的笛卡尔积进行笛卡尔数据帧比较。

我正在尝试的方式是先做笛卡尔积,  将其转移到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
        });

即使我可以使用spark来做笛卡尔式

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();
        }
    });

请建议处理此问题的好方法。

1 个答案:

答案 0 :(得分:0)

不确定我是否完全理解您的问题。以下是使用Spark和Java的笛卡尔样本。

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();
  }
}