2017-08-04 19 views
0

私はsqlContextを一度に作成し、それを2回おきにアクセスしています。spark 2.1の共有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が届きます。

答えて

0

SQLContextは、決して呼び出されないmain関数内で初期化されます。あなたはにあなたのコードを変更した場合:最初のケースSQLContext

public class B { 
    public static void main(String[] args) { 
    A.main() 
    System.out.println(A.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); 
    } 
} 
+0

何私は静的関数を通してそれを初期化する場合は?すべての呼び出しで初期化する必要はありません。初期化のためには一度だけの作業が必要です。私が言っているのは、初期化後に私はアクセスを得ることができるということです。 – Bond

関連する問題