ApacheSpark将示例与Java连接起来

ApacheSpark将示例与Java连接起来,java,join,apache-spark,optional,Java,Join,Apache Spark,Optional,我对Apache Spark很陌生。实际上,我想专注于基本的Spark API规范,并想了解和编写一些使用Spark API的程序。 我已经使用ApacheSpark编写了一个java程序来实现连接概念 当我使用Left-outerjoin--leftOuterJoin()或Right-outerjoin--righouterjoin()时,这两个方法都返回一个javapairdd,其中包含一个特殊类型的Google Options。但我不知道如何从可选类型中提取原始值。 无论如何,我想知道我是

我对Apache Spark很陌生。实际上,我想专注于基本的Spark API规范,并想了解和编写一些使用Spark API的程序。 我已经使用ApacheSpark编写了一个java程序来实现连接概念

当我使用Left-outerjoin--leftOuterJoin()或Right-outerjoin--righouterjoin()时,这两个方法都返回一个javapairdd,其中包含一个特殊类型的Google Options。但我不知道如何从可选类型中提取原始值。

无论如何,我想知道我是否可以使用以我自己的格式返回数据的相同联接方法。我没有找到任何方法去做那件事。意思是当我使用ApacheSpark时,我无法以自己的风格定制代码,因为他们已经给出了所有预定义的东西。

请在下面查找代码

my 2 sample input datasets

customers_data.txt:
4000001,Kristina,Chung,55,Pilot
4000002,Paige,Chen,74,Teacher
4000003,Sherri,Melton,34,Firefighter

and

trasaction_data.txt
00000551,12-30-2011,4000001,092.88,Games,Dice & Dice Sets,Buffalo,New York,credit
00004811,11-10-2011,4000001,180.35,Outdoor Play Equipment,Water Tables,Brownsville,Texas,credit
00034388,09-11-2011,4000002,020.55,Team Sports,Beach Volleyball,Orange,California,cash
00008996,11-21-2011,4000003,121.04,Outdoor Recreation,Fishing,Colorado Springs,Colorado,credit
00009167,05-24-2011,4000003,194.94,Exercise & Fitness,Foam Rollers,El Paso,Texas,credit
这是我的Java代码

**SparkJoins.java:**

public class SparkJoins {

    @SuppressWarnings("serial")
    public static void main(String[] args) throws FileNotFoundException {
        JavaSparkContext sc = new JavaSparkContext(new SparkConf().setAppName("Spark Count").setMaster("local"));
        JavaRDD<String> customerInputFile = sc.textFile("C:/path/customers_data.txt");
        JavaPairRDD<String, String> customerPairs = customerInputFile.mapToPair(new PairFunction<String, String, String>() {
            public Tuple2<String, String> call(String s) {
                String[] customerSplit = s.split(",");
                return new Tuple2<String, String>(customerSplit[0], customerSplit[1]);
            }
        }).distinct();

        JavaRDD<String> transactionInputFile = sc.textFile("C:/path/transactions_data.txt");
        JavaPairRDD<String, String> transactionPairs = transactionInputFile.mapToPair(new PairFunction<String, String, String>() {
            public Tuple2<String, String> call(String s) {
                String[] transactionSplit = s.split(",");
                return new Tuple2<String, String>(transactionSplit[2], transactionSplit[3]+","+transactionSplit[1]);
            }
        });

        //Default Join operation (Inner join)
        JavaPairRDD<String, Tuple2<String, String>> joinsOutput = customerPairs.join(transactionPairs);
        System.out.println("Joins function Output: "+joinsOutput.collect());

        //Left Outer join operation
        JavaPairRDD<String, Iterable<Tuple2<String, Optional<String>>>> leftJoinOutput = customerPairs.leftOuterJoin(transactionPairs).groupByKey().sortByKey();
        System.out.println("LeftOuterJoins function Output: "+leftJoinOutput.collect());

        //Right Outer join operation
        JavaPairRDD<String, Iterable<Tuple2<Optional<String>, String>>> rightJoinOutput = customerPairs.rightOuterJoin(transactionPairs).groupByKey().sortByKey();
        System.out.println("RightOuterJoins function Output: "+rightJoinOutput.collect());

        sc.close();
    }
}
我正在Windows平台上运行此程序

请观察上述输出,并帮助我从可选类型中提取值


提前感谢

当您执行左外联接和右外联接时,可能会有空值。对!

所以spark返回可选对象。获得该结果后,您可以将该结果映射到自己的格式

您可以使用可选的isPresent()方法映射数据

以下是一个例子:

 JavaPairRDD<String,String> firstRDD = ....
 JavaPairRDD<String,String> secondRDD =....
 // join both rdd using left outerjoin
 JavaPairRDD<String, Tuple2<String, Optional<Boolean>>> rddWithJoin = firstRDD.leftOuterJoin(secondRDD);


// mapping of join result
JavaPairRDD<String, String> mappedRDD = rddWithJoin
            .mapToPair(tuple -> {
                if (tuple._2()._2().isPresent()) {
                    //do your operation and return
                    return new Tuple2<String, String>(tuple._1(), tuple._2()._1());
                } else {
                    return new Tuple2<String, String>(tuple._1(), "not present");
                }
            });
javapairdd firstRDD=。。。。
JavaPairRDD secondRDD=。。。。
//使用左外联连接两个rdd
javapairdd rddWithJoin=firstRDD.leftOuterJoin(secondRDD);
//连接结果的映射
javapairdd mappedRDD=rddWithJoin
.mapToPair(元组->{
if(元组。\u 2()。\u 2().isPresent()){
//做你的手术然后回来
返回新的Tuple2(tuple.\u 1(),tuple.\u 2()。\u 1());
}否则{
返回新的Tuple2(tuple._1(),“not present”);
}
});

在Java中,我们还可以使用数据帧实现连接,如下所示:

1) 将spark会话创建为:

SparkSession spark = SparkSession.builder().appName("JoinsInSpark").master("local").getOrCreate();
2) 我将员工输入作为:

昆士兰州墨尔本弗兰克林街艾伦101号

新南威尔士州悉尼朗斯代尔街斯图尔特104号

将数据帧创建为:

Dataset<Employee> e_data = spark
                        .read()
                        .textFile("C:/XX/XX/test.txt")
                        .map(line -> {
                            Employee e = new Employee();
                            String[] parts = line.split(",");
                            e.setE_id(Integer.valueOf(parts[0].trim()));
                            e.setE_name(parts[1].trim());
                            e.setAddress(parts[2].trim());
                            e.setCity(parts[3].trim());
                            e.setState(parts[4].trim());
                            return e;
                        }, Encoders.bean(Employee.class));

为什么不改用Scala呢?嗨@maasg,我基本上是一名java开发人员。。我真的不知道斯卡拉。。但我认为ApacheSpark比Java更适合Scala编程。@ShekarPatel能否请您更新您的代码,说明您是如何删除该选项的。。这将对其他人有帮助。@sms_1190如何将结果映射到我们自己的格式?我也面临同样的问题。@Shankar:我在上面的答案中添加了这个例子。mappedRDD是您自己的格式。
Dataset<Employee> e_data = spark
                        .read()
                        .textFile("C:/XX/XX/test.txt")
                        .map(line -> {
                            Employee e = new Employee();
                            String[] parts = line.split(",");
                            e.setE_id(Integer.valueOf(parts[0].trim()));
                            e.setE_name(parts[1].trim());
                            e.setAddress(parts[2].trim());
                            e.setCity(parts[3].trim());
                            e.setState(parts[4].trim());
                            return e;
                        }, Encoders.bean(Employee.class));
Dataset<Row> d1 = e_data.distinct().join(s_data.distinct(), "e_id").orderBy("salary");

d1.show();
spark.sql("select * from global_temp.employee e LEFT OUTER JOIN global_temp.salary s on e.e_id = s.e_id").show();