【问题标题】:How to create SparkSession from existing SparkContext如何从现有的 SparkContext 创建 SparkSession
【发布时间】:2017-08-13 14:22:22
【问题描述】:

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

但是我找不到如何做到这一点的方法。我发现带有SparkContextSparkSession 构造函数是私有的,因此我无法以这种方式对其进行初始化,并且构建器不提供任何setSparkContext 方法。您认为存在一些解决方法吗?

【问题讨论】:

  • 我不太确定,但据我所知,没有解决方法
  • 是的 :( 所以如果没有解决方法,还有两个选项:在我的应用程序中使用 SparkContext 或添加对 sparkSession 的支持到我在顶部构建的应用程序(它是 spark-jobserver,我是使用他们的分支 spark-2.0-preview 但他们仍然使用 sparkContext)
  • 您只需要在应用程序中添加对外部 SparkContext 的支持并访问 session.sparkContext。应该不是什么大问题。
  • 你能解释一下“添加对外部 SparkContext 的支持”的意思吗?我读到你应该只使用 sparkcontext 的一个实例
  • 我想应用程序会创建自己的 SparkContext。由于您只需要一个 SparkContext(有充分的理由),因此您需要向应用程序的构造函数或生成器添加一个参数,以接受您已经使用会话生成器创建的外部 SparkContext。

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


【解决方案1】:

SparkContext 甚至SparkConf 派生SparkSession 对象很容易。只是您可能会发现 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()

希望有帮助!

【讨论】:

  • 这确实有效。这是应该接受的。
  • val spark = SparkSession.builder.config(conf).getOrCreate() 而不是 sc.getConf 因为你已经有了 conf。
【解决方案2】:
val sparkSession = SparkSession.builder.config(sc.getConf).getOrCreate()

【讨论】:

  • 请编辑您的答案以包含有关为什么以及如何解决 OP 问题的详细信息。
  • 在 PySpark 中这可能会导致 AttributeError: 'function' object has no attribute 'getAll'
【解决方案3】:

您会注意到我们正在使用 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

【讨论】:

    【解决方案4】:

    像上面的例子你不能创建因为SparkSession的构造函数是私有的 相反,您可以使用SparkContext 创建一个SQLContext,然后像这样从sqlcontext 中获取sparksession

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

    希望对你有帮助

    【讨论】:

    • 当我在 Spark 2.2 中执行此操作时,它说 SQLContext 已被弃用并改用 SparkSession.Builder()
    • 正确。在 Spark 2 中,不推荐使用 SQLContext,因为所有内容都合并到 SparkSession,这就是为什么您只需使用 SparkSession.sql() 来执行 Spark SQL,SparkSession.sparkContext 在需要时获取上下文等。如果您是寻找 Hive 支持(以前的 HiveContext),你做类似val spark = SparkSession.builder().enableHiveSupport()
    【解决方案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;
    }
    

    【讨论】:

    • 在您的第二种方法中,您不使用任何火花上下文,在 scala 中我无法像在您的 getSparkSession() 中那样构造 SparkSession
    【解决方案6】:

    显然没有办法从现有的SparkContext 初始化SparkSession

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2017-01-15
      相关资源
      最近更新 更多