在 spark 2.1 中访问共享的 SqlContext

Posted

技术标签:

【中文标题】在 spark 2.1 中访问共享的 SqlContext【英文标题】:Accessing shared SqlContext in spark 2.1 【发布时间】:2017-08-04 09:14:03 【问题描述】:

我一次创建sqlContext,然后每隔一段时间访问一次。

我使用这种语法创建了sqlcontext

class A 
    static SparkConf conf = new SparkConf().setMaster("local").setAppName("SparkApp");
    static JavaSparkContext sc = new JavaSparkContext(conf);
    static SQLContext sqlContext = new SQLContext(sc);
public static void main(String[] args) throws InterruptedException 
     Thread.sleep(86400000);
     


public class B 
    public static void main(String[] args)  
    System.out.println(A.sqlContext);
    

我可以在创建后从另一个文件 B 访问这个 sqlContext

但是当我像这样使用sparkSession 创建sqlContext 时:

class A 
    public static SparkConf conf = null;
    public static JavaSparkContext context = null;
    public static SparkListener listener = null;
    public static SQLContext sqlContext = null;
    public static SparkSession sparkSession = null;
public static void main(String[] args) throws InterruptedException 
    conf = new SparkConf();
    sparkSession = SparkSession.builder().appName("TestCsv").master("local").config(conf)
                        // .enableHiveSupport()
                           .getOrCreate();
     context = new JavaSparkContext(sparkSession.sparkContext());
     sqlContext = sparkSession.sqlContext();
     Thread.sleep(86400000);
     


public class B 
    public static void main(String[] args)  
    System.out.println(A.sqlContext);
    

我可以创建sqlContext。 现在,当我尝试从另一个文件 B 访问此 sqlContext 时,它给了我 null

【问题讨论】:

【参考方案1】:

在第二种情况下,SQLContextmain 函数中初始化,该函数永远不会被调用。如果您将代码更改为:

public class B 
    public static void main(String[] args)  
    A.main()
    System.out.println(A.sqlContext);
    

在第一种情况下,SQLContext 在声明时被初始化。

一般来说,为了共享上下文,我会在

中初始化它
object App 
    public static void main(String[] args)  
    val spark = SparkSession.builder.getOrCreate()


    

main 并在必要时使用getOrCreate 方法:

public class B 
    public static void main(String[] args)  
      System.out.println(SparkSession.builder.getOrCreate().sqlContext);
    

【讨论】:

如果我通过静态函数初始化它会怎样?我不希望它在每次调用时都进行初始化。它需要是一次性的初始化任务。我要说的是在初始化之后我就可以访问了。

以上是关于在 spark 2.1 中访问共享的 SqlContext的主要内容,如果未能解决你的问题,请参考以下文章

Spark教程——Spark-shell基于Phoenix访问HBase数据

3天掌握Spark--RDD 共享变量

在 Spark 2.1 独立集群的客户端部署模式下,RDD 或 Spark SQL 数据帧在哪里存储或持久化?

在每个分区内具有共享指针的 Spark RDD(以及幻数 200??)

在 Apache Spark 中跨执行程序共享数据

Apache Spark SQLContext 与 HiveContext 有啥区别?