spark的SparkContext,SparkConf和SparkSession及dataframe和RDD的区别

spark的SparkContext,SparkConf和SparkSession及dataframe和RDD的区别

SparkContext 和 SparkConf

任何Spark程序都是SparkContext开始的,SparkContext的初始化需要一个SparkConf对象,SparkConf包含了Spark集群配置的各种参数。
初始化后,就可以使用SparkContext对象所包含的各种方法来创建和操作RDD和共享变量。

al conf = new SparkConf().setMaster("master").setAppName("appName")
val sc = new SparkContext(conf)
或者
val sc = new SparkContext("master","appName")

Note:

Once a SparkConf object is passed to Spark, it is cloned and can no longer be modified by the user.
  也就是说一旦设置完成SparkConf,就不可被使用者修改

对于单元测试,您也可以调用SparkConf(false)来跳过加载外部设置,并获得相同的配置,无论系统属性如何。

咱们再看看setMaster()和setAppName()源码:

据上面的解释,setMaster主要是连接主节点,如果参数是"local",则在本地用单线程运行spark,如果是 local[4],则在本地用4核运行,如果设置为spark://master:7077,就是作为单节点运行,而setAppName就是在web端显示应用名而已,它们说到底都调用了set()函数,让我们看看set()是何方神圣

SparkSession实质上是SQLContext和HiveContext的组合(未来可能还会加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了sparkContext,所以计算实际上是由sparkContext完成的

val sparkSession = SparkSession.builder
                    .master("master")
                    .appName("appName")
                    .getOrCreate()
或者
SparkSession.builder.config(conf=SparkConf())

上面代码类似于创建一个SparkContext,master设置为"xiaojukeji",然后创建了一个SQLContext封装它。如果你想创建hiveContext,可以使用下面的方法来创建SparkSession,以使得它支持Hive(HiveContext):

val sparkSession = SparkSession.builder
                    .master("master")
                    .appName("appName")
                    .enableHiveSupport()
                    .getOrCreate()
//sparkSession 从csv读取数据:
 
val dq = sparkSession.read.option("header", "true").csv("src/main/resources/scala.csv")

getOrCreate():有就拿过来,没有就创建,类似于单例模式:

s1 = SparkSession().builder.config("k1", "v1").getORCreat()
s2 = SparkSession().builder.config("k2", "v2").getORCreat()
return s1.conf.get("k1") == s2.conf.get("k2")

True

dataframe和RDD的区别

数据结构和操作方式:

DataFrame是基于列的数据结构,类似于关系型数据库中的表格,每列都有自己的名称和数据类型,支持SQL查询、结构化数据处理和机器学习等高级操作。
RDD(弹性分布式数据集)是基于分布式内存的数据结构,是一个不可变的分布式数据集合,可以进行类似MapReduce的操作,如映射、过滤、聚合等。
用途和优化:

DataFrame提供了比RDD更丰富的算子操作,并且利用已知的结构信息来提升执行效率、减少数据读取以及执行计划的优化,如filter下推、裁剪等。
RDD的操作是基于函数式编程的,主要包括转换操作和行动操作,但需要手动编写代码来进行数据处理和转换。
结构和设计目的:

RDD是Spark平台对数据的一种存储、计算以及任务调度的逻辑基础,具有通用性,适用于各类数据源。
DataFrame是针对结构化数据源的高层数据抽象,在创建过程中必须指定数据集的结构信息(Schema),具有专用性。
使用场景:

DataFrame适合处理结构化数据,并提供了丰富的API和优化来提高数据处理和分析的效率。
RDD更适合处理非结构化数据和复杂的计算任务,因为它提供了低级别的API和灵活性来处理各种类型的数据。
综上所述,DataFrame和RDD在Spark中扮演着不同的角色,DataFrame更适合处理结构化数据并提供高级操作和优化,而RDD则提供了更灵活的底层操作来处理非结构化数据。
posted @ 2024-05-16 18:56  a-tao必须奥利给  阅读(124)  评论(0编辑  收藏  举报