【问题标题】:Accessing shared SqlContext in spark 2.1在 spark 2.1 中访问共享的 SqlContext
【发布时间】: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

【问题讨论】:

    标签: java scala apache-spark apache-spark-sql


    【解决方案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);
        }
    }
    

    【讨论】:

    • 如果我通过静态函数初始化它会怎样?我不希望它在每次调用时都进行初始化。它需要是一次性的初始化任务。我要说的是在初始化之后我就可以访问了。
    猜你喜欢
    • 2018-05-15
    • 2016-11-24
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多