SparkContext、JavaSparkContext、SQLContext和SparkSession的区别?
Posted
技术标签:
【中文标题】SparkContext、JavaSparkContext、SQLContext和SparkSession的区别?【英文标题】:Difference between SparkContext, JavaSparkContext, SQLContext, and SparkSession? 【发布时间】:2017-10-03 19:25:34 【问题描述】:SparkContext,
JavaSparkContext,
SQLContext
和SparkSession
有什么区别?
是否有任何方法可以使用SparkSession
转换或创建上下文?
我可以使用一个条目 SparkSession
完全替换所有上下文吗?
SQLContext
、SparkContext
和JavaSparkContext
中的所有函数是否也在SparkSession
中?
parallelize
等一些函数在SparkContext
和JavaSparkContext
中具有不同的行为。他们在SparkSession
中的表现如何?
如何使用SparkSession
创建以下内容?
RDD
JavaRDD
JavaPairRDD
Dataset
有没有办法将JavaPairRDD
转换为Dataset
或将Dataset
转换为JavaPairRDD
?
【问题讨论】:
【参考方案1】:sparkContext
是 Scala 实现入口点,JavaSparkContext
是 sparkContext
的 java 包装器。
SQLContext
是SparkSQL的入口点,可以从sparkContext
接收。在2.xx之前,RDD、DataFrame和Data-set是三种不同的数据抽象。从Spark 2.xx开始,这三种数据抽象都是统一,SparkSession
是 Spark 的统一入口。
另外需要注意的是,RDD 用于非结构化数据、强类型数据,而 DataFrames 用于结构化和松散类型数据。你可以check
有什么方法可以使用 Sparksession 转换或创建 Context 吗?
是的。它的 sparkSession.sparkContext()
和 SQL,sparkSession.sqlContext()
我可以使用一个条目 SparkSession 完全替换所有上下文吗?
是的。您可以从 sparkSession 获取相应的上下文。
SQLContext、SparkContext、JavaSparkContext等中的所有函数都添加到SparkSession中了吗?
不直接。你必须获得相应的上下文并利用它。类似于向后兼容性
如何在 SparkSession 中使用该功能?
获取相应的上下文并加以利用。
如何使用 SparkSession 创建以下内容?
-
可以从
sparkSession.sparkContext.parallelize(???)
创建RDD
JavaRDD 同样适用于此,但在 java 实现中
JavaPairRDD sparkSession.sparkContext.parallelize(???).map(//making your data as key-value pair here is one way)
如果是结构化数据,sparkSession返回的Dataset就是Dataset。
【讨论】:
【参考方案2】:来自分支2.1下spark源码的解释
SparkContext: Spark 功能的主要入口点。 SparkContext 表示与 Spark 的连接 集群,并可用于在该集群上创建 RDD、累加器和广播变量。
每个 JVM 只能有一个 SparkContext 处于活动状态。您必须先stop()
活动的 SparkContext
创建一个新的。这一限制最终可能会被取消;有关详细信息,请参阅 SPARK-2243。
JavaSparkContext: 返回的 [[org.apache.spark.SparkContext]] 的 Java 友好版本 [[org.apache.spark.api.java.JavaRDD]]s 并使用 Java 集合而不是 Scala 集合。
每个 JVM 只能有一个 SparkContext 处于活动状态。你必须stop()
活动的 SparkContext 之前
创建一个新的。这一限制最终可能会被取消;有关详细信息,请参阅 SPARK-2243。
SQLContext: 在 Spark 1.x 中处理结构化数据(行和列)的入口点。
从 Spark 2.0 开始,它被 [[SparkSession]] 取代。但是,我们保留课程 这里是为了向后兼容。
SparkSession: 使用 Dataset 和 DataFrame API 编程 Spark 的入口点。
【讨论】:
我们为什么以及在哪里使用JavaSparkContext
?【参考方案3】:
我将只讨论 Spark 版本 2.x。
SparkSession:它是您的 spark 应用程序的主要入口点。要在您的 spark 上运行任何代码,这是您应该创建的第一件事。
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local").appName("Word Count")\
.config("spark.some.config.option", "some-value")\
.getOrCreate()
SparkContext:它是 SparkSession 的一个内部对象(属性)。它用于与Low-Level API
交互,通过SparkContext
可以创建RDD
、accumlator
和Broadcast variables
。
在大多数情况下,您不需要SparkContext
。你可以从SparkSession
得到SparkContext
val sc = spark.sparkContext
【讨论】:
【参考方案4】:Spark Context 是 Spark API 中的类,这是构建 spark 应用程序的第一个阶段。 spark上下文的功能是在RAM中创建内存,我们称之为驱动内存,分配执行器和内核的数量,简而言之,它与集群管理有关。 Spark Context 可用于创建 RDD 和共享变量。要访问它,我们需要创建它的对象。
这样我们可以创建 Spark Context :: var sc=new SparkContext()
Spark Session 这是自 spark 2.x 以来添加的新对象,它是 Sql Context 和 Hive Context 的替代品。 之前我们有两个选项,一个是 Sql Context,它是在 Dataframe 上执行 sql 操作的方式,第二个是 Hive Context,它管理 Hive 连接相关的东西并从 Hive 表中获取/插入数据。
自从 2.x 出现以来,我们可以为 Dataframe 上的 SQL 操作创建 SparkSession,如果您有任何与 Hive 相关的工作,只需调用方法 enablehivesupport() 然后您可以将 SparkSession 用于 Dataframe 和 hive 相关的 SQL 操作。
这样我们就可以为Dataframe上的Sql操作创建SparkSession
val sparksession=SparkSession.builder().getOrCreate();
第二种方法是为Dataframe上的Sql操作以及Hive操作创建SparkSession。
val sparkSession=SparkSession.builder().enableHiveSupport().getOrCreate()
【讨论】:
【参考方案5】:Spark 上下文:
从 Spark 1.x 开始,Spark SparkContext 是 Spark 的入口点,并在 org.阿帕奇。 spark 包,用于以编程方式在集群上创建 Spark RDD、累加器和广播变量。它的对象 sc 是 spark-shell 中可用的默认变量,可以使用 SparkContext 类以编程方式创建。
SparkContext 是 spark 执行环境的客户端。 SparkContext 是 spark 执行作业的入口点。 SparkContext 充当 spark 应用程序的主人。
希望您会发现这个Apache SparkContext Examples 网站有用。
SparkSession:
自 Spark 2.0 以来,SparkSession 已成为 Spark 使用 RDD、DataFrame 和 Dataset 的入口点。在 2.0 之前,SparkContext 曾经是一个入口点。在这里,我将主要通过定义和描述如何创建 Spark Session 以及使用 spark-shell 中的默认 Spark Session 'spark' 变量来解释什么是 SparkSession。
Apache spark2.0 以后,spark session 是 spark 应用的新入口。 spark 上下文提供的所有功能都在 Spark 会话中可用。 spark session 提供用于处理数据集和数据帧的 API。 Spark2.0 之前:
Spark Context 是 Spark 作业的入口点。 RDD 是当时的主要 API 之一,它是使用 spark Context 创建和操作的。 对于其他所有 API,需要不同的上下文 - 对于 SQL,需要 SQL 上下文。
您可以在Apache SparkSession 上找到更多实时示例。
SQLContext: 在 Spark 1.0 版中,SQLContext (org.apache.spark.sql.SQLContext) 是 SQL 的入口点,以便处理结构化数据(行和列),但是 2.0 版的 SQLContext 已被 SparkSession 取代。 Apache Spark SQLContext 是 SparkSQL 的入口点,它是 Spark 1.x 中结构化数据(行和列)的 Spark 模块。加工。 Spark SQLContext 已初始化。 apache-spark SQL 上下文是 Spark SQL 的入口点,可以从 spark 上下文中接收 JavaSparkContext:
JavaSparkContext For JAVARDD 与上述相同,但在 java 实现中。
JavaSparkContext Java 友好版本的 [[org.apache.spark.SparkContext]] 返回 [[org.apache.spark.api.java.JavaRDD]] 并使用 Java 集合而不是 Scala 集合。
【讨论】:
以上是关于SparkContext、JavaSparkContext、SQLContext和SparkSession的区别?的主要内容,如果未能解决你的问题,请参考以下文章