访问spark 2.1中的共享SqlContext

时间:2017-08-04 09:14:03

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

我一次创建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

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

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 个答案:

答案 0 :(得分:0)

在第二种情况下,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);
    }
}