我一次创建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
。
答案 0 :(得分:0)
在第二种情况下,SQLContext
在main
函数内初始化,永远不会被调用。如果您将代码更改为:
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);
}
}