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则提供了更灵活的底层操作来处理非结构化数据。