在 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】:在第二种情况下,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);
【讨论】:
如果我通过静态函数初始化它会怎样?我不希望它在每次调用时都进行初始化。它需要是一次性的初始化任务。我要说的是在初始化之后我就可以访问了。以上是关于在 spark 2.1 中访问共享的 SqlContext的主要内容,如果未能解决你的问题,请参考以下文章
Spark教程——Spark-shell基于Phoenix访问HBase数据
在 Spark 2.1 独立集群的客户端部署模式下,RDD 或 Spark SQL 数据帧在哪里存储或持久化?