Ответ 1
По-видимому, нет способа инициализировать SparkSession
из существующего SparkContext
.
У меня есть приложение Spark, которое использует новый API Spark 2.0 с SparkSession
.
Я создаю это приложение поверх другого приложения, которое использует SparkContext
. Я хотел бы передать SparkContext
в мое приложение и инициализировать SparkSession
с помощью существующего SparkContext
.
Однако я не мог найти способ, как это сделать. Я обнаружил, что конструктор SparkSession
с SparkContext
является закрытым, поэтому я не могу его инициализировать таким образом, и строитель не предлагает никакого метода setSparkContext
. Как вы думаете, существует ли какое-то обходное решение?
По-видимому, нет способа инициализировать SparkSession
из существующего SparkContext
.
Как и в примере выше, вы не можете создать, потому что конструктор SparkSession
является закрытым
Вместо этого вы можете создать SQLContext
с помощью SparkContext
, а затем получить sparksession из sqlcontext, как это
val sqlContext=new SQLContext(sparkContext);
val spark=sqlContext.sparkSession
Надеюсь, что это поможет
public JavaSparkContext getSparkContext()
{
SparkConf conf = new SparkConf()
.setAppName("appName")
.setMaster("local[*]");
JavaSparkContext jsc = new JavaSparkContext(conf);
return jsc;
}
public SparkSession getSparkSession()
{
sparkSession= new SparkSession(getSparkContext().sc());
return sparkSession;
}
you can also try using builder
public SparkSession getSparkSession()
{
SparkConf conf = new SparkConf()
.setAppName("appName")
.setMaster("local");
SparkSession sparkSession = SparkSession
.builder()
.config(conf)
.getOrCreate();
return sparkSession;
}
Вы заметили бы, что мы используем SparkSession и SparkContext, и это не ошибка. Позвольте вернуться к летописи истории искры для перспективы. Важно понять, откуда мы пришли, поскольку вы будете слышать об этих объектах связи в течение некоторого времени.
До Spark 2.0.0 тремя основными объектами подключения были SparkContext, SqlContext и HiveContext. Объект SparkContext был соединением с средой выполнения Spark и созданными RDD и другими, SQLContext работал с SparkSQL на фоне SparkContext, а HiveContext взаимодействовал с магазинами Hive.
В Spark 2.0.0 введены наборы данных /DataFrames в качестве основного интерфейса абстракции данных и объекта SparkSession в качестве точки входа в среду выполнения Spark. Соответственно, объект SparkSession находится в пространстве имен, org.apache.spark.sql.SparkSession(Scala) или pyspark.sql.sparkSession. Несколько замечаний:
В Scala и Java, Datasets образуют основную абстракцию данных в виде типизированных данных; однако для Python и R (которые не имеют проверки типа времени компиляции) данные...
val sparkSession = SparkSession.builder.config(sc.getConf).getOrCreate()
SparkSession
объект SparkSession
из SparkContext
или даже SparkConf
легко. Просто вы можете обнаружить, что API немного запутан. Вот пример (я использую Spark 2.4
но это должно работать и в более старых версиях 2.x
):
// If you already have SparkContext stored in 'sc'
val spark = SparkSession.builder.config(sc.getConf).getOrCreate()
// Another example which builds a SparkConf, SparkContext and SparkSession
val conf = new SparkConf().setAppName("spark-test").setMaster("local[2]")
val sc = new SparkContext(conf)
val spark = SparkSession.builder.config(sc.getConf).getOrCreate()
Надеюсь, это поможет!