如何从现有的SparkContext创建SparkSession

时间:2017-03-21 18:20:37

标签: scala apache-spark apache-spark-2.0

我有一个Spark应用程序,它使用带有SparkSession的Spark 2.0新API。 我正在使用SparkContext的另一个应用程序之上构建此应用程序。我想将SparkContext传递给我的应用,并使用现有的SparkSession初始化SparkContext

但是我找不到办法如何做到这一点。我发现带有SparkSession的{​​{1}}构造函数是私有的,因此我无法以这种方式初始化它,并且构建器不提供任何SparkContext方法。你认为有一些解决方法吗?

6 个答案:

答案 0 :(得分:14)

显然,如何从现有SparkSession初始化SparkContext

答案 1 :(得分:14)

与上面的示例一样,您无法创建,因为SparkSession的构造函数是私有的 相反,你可以使用SQLContext创建一个SparkContext,然后从sqlcontext中获得这样的兴趣

val sqlContext=new SQLContext(sparkContext);
val spark=sqlContext.sparkSession

希望这有帮助

答案 2 :(得分:5)

public JavaSparkContext getSparkContext() 
{
        SparkConf conf = new SparkConf()
                    .setAppName("appName")
                    .setMaster("local[*]");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        return jsc;
}


public  SparkSession getSparkSession()
{
        sparkSession= new SparkSession(getSparkContext().sc());
        return sparkSession;
}


you can also try using builder  

public SparkSession getSparkSession()
{
        SparkConf conf = new SparkConf()
                        .setAppName("appName")
                        .setMaster("local");

       SparkSession sparkSession = SparkSession
                                   .builder()
                                   .config(conf)
                                  .getOrCreate();
        return sparkSession;
}

答案 3 :(得分:3)

val sparkSession = SparkSession.builder.config(sc.getConf).getOrCreate()

答案 4 :(得分:3)

SparkSession甚至SparkContext中导出SparkConf对象很容易。只是您可能会发现API有点复杂。这是一个示例(我使用的是Spark 2.4,但它也应在较早的2.x版本中起作用)

// If you already have SparkContext stored in `sc`
val spark = SparkSession.builder.config(sc.getConf).getOrCreate()

// Another example which builds a SparkConf, SparkContext and SparkSession
val conf = new SparkConf().setAppName("spark-test").setMaster("local[2]")
val sc = new SparkContext(conf)
val spark = SparkSession.builder.config(sc.getConf).getOrCreate()

希望有帮助!

答案 5 :(得分:1)

您会注意到我们正在使用SparkSession和SparkContext,这不是错误。让我们重新审视Spark历史的历史。重要的是要了解我们来自哪里,因为您将在未来一段时间内听到这些连接对象。

在Spark 2.0.0之前,三个主要的连接对象是SparkContext,SqlContext和HiveContext。 SparkContext对象是与Spark执行环境的连接并创建了RDD和其他对象,SQLContext在SparkContext的后台使用SparkSQL,HiveContext与Hive存储进行交互。

Spark 2.0.0引入了Datasets / DataFrames作为主要的分布式数据抽象接口,SparkSession对象作为Spark执行环境的入口点。适当地,SparkSession对象位于命名空间org.apache.spark.sql.SparkSession(Scala)或pyspark.sql.sparkSession中。需要注意的几点如下:

在Scala和Java中,数据集将主数据抽象形成为类型化数据;但是,对于Python和R(没有编译时类型检查),数据......

https://www.packtpub.com/mapt/book/big_data_and_business_intelligence/9781785889271/4/ch04lvl1sec31/sparksession-versus-sparkcontext