SparkContext转化为JavaSparkContext

自动Spark2.0发布以来,官方最开始推荐的代码由

final SparkConf conf = new SparkConf().setMaster("local").setAppName("---");
final JavaSparkContext ctx = new JavaSparkContext(conf);

这种形式转化成为了

SparkSession spark = SparkSession
                .builder()
                .master("local")
                .appName("---")
                .getOrCreate();
  • ,但是这样对于Java程序员有一定问题。

问题

当我们使用Java语言进行编程的时候,尤其是需要对文本文件进行textFile读取的时候,容易产生类型错误,这样的原因是因为由上面代码实例化的spark调用sparkContext()方法获取的context对象是scala的SparkContext对象,而不是我们最开始的手动方法获取的JavaSparkContext对象。 
所以,当我们调用textFile方法的时候,返回的数据类型为RDD而不是JavaRDD

解决方法

JavaRDD text = 
        JavaSparkContext.fromSparkContext(spark.sparkContext())
        .textFile("path");

使用JavaSparkContextfromSparkContext方法对原本的context进行数据类型转化即可。

 

例子

SparkContext sparkContext= sparkSession.sparkContext();
JavaSparkContext javaSparkContext = JavaSparkContext.fromSparkContext(sparkContext);
JavaRDD people = javaSparkContext.textFile("data/people.txt").map(
        new Function() {
            @Override
            public Person call(String line) {
                String[] parts = line.split(",");
                Person person = new Person();
                person.setName(parts[0]);
                person.setAge(Integer.parseInt(parts[1].trim()));
                return person;
            }
        });
try {
    Dataset schemaPeople = sparkSession.createDataFrame(people, Person.class);
    schemaPeople.createGlobalTempView("people");
    Dataset teenagers = sparkSession.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19");
    teenagers.show();
} catch (AnalysisException e) {
    e.printStackTrace();
}

你可能感兴趣的:(spark,java)