目录
RDD
sql
RDD
- RDD(Resilient Distributed Dataset) 弹性分布式数据集,spark中最重要数据结构概念,代表一个不可变、可分区、可并行计算的集合,逻辑上是一个数据集,物理上可以分块分布在不同的机器上并发运行。
一.创建RDD
(1)从内部读取数据创建RDD
1.parallelize()
val data=Array(1,2,3,4,5)
val distData=spark.sparkContext.parallelize(data)
2.makeRDD()
val seq=Seq((1,Seq("iteblog.com","sparkhost1.com")),
(3,Seq("iteblog.com","sparkhost2.com")),
(2,Seq("iteblog.com","sparkhost3.com"))),
val iteblog=spark.sparkContext.makeRDD(seq)
iteblog.collect
(2)从外部储存系统中读取数据创建RDD
1.通过linux本地文件创建RDD
rdd1 = spark.sparkContext.textFile("hdfs://path/to/your/file.txt")
二.转换操作
(1)map()
例如:可通过map()方法对一个元素进行 平方运算
val distData= spark.sparkContext.parallelize(List(1,3,45,3,76))
val sq_dist=distData.map(x => x*x)
(2)flatMap()
val test=spark.sparkContext.parallelize(List("How are you","i am fine","what about you"))
test.collect
test.flatMap(x=> x.split(" ")).collect
(3)union()
用于将两个RDD合并成一个
val rdd1=spark.sparkContext.parallelize(List(('a',1),('b',2),('c',3)))
val rdd2=spark.sparkContext.parallelize(List(('a',1),('d',4),('e',5)))
rdd1.union(rdd2).collect
(4)filter()
用于过滤元素
val rdd1=spark.sparkContext.parallelize(List(('a',1),('b',2),('c',3)))
rdd1.filter(_._2 >1).collect
rdd1.filter(x => x._2 >1).collect
(5)groupByKey()
val rdd_1=spark.sparkContext.parallelize(List(('a',1),('a',2),('b',1),('c',1),('c',1)))
val g_rdd=rdd_1.groupByKey()
g_rdd.collect
g_rdd.map(x=>(x._1,x._2.size)).collect
(6)reduceByKey()
合并统计键相同的值
val rdd_1=spark.sparkContext.parallelize(List(('a',1),('a',2),('b',1),('c',1),('c',2)))
val re_rdd_1=rdd_1.reduceByKey((a,b)=>a+b)
re_rdd_1.collect
(7) intersection()
找出两个RDD的交集
val rdd_6=spark.sparkContext.parallelize(List(('a',1),('a',1),('b',1),('c',1)))
val rdd_7=spark.sparkContext.parallelize(List(('a',1),('b',1),('d',1)))
rdd_6.intersection(rdd_7).collect
(8)subtract()
找出两个RDD的补集
val rdd_16=spark.sparkContext.parallelize(List(('a',1),('b',1),('c',1)))
val rdd_17=spark.sparkContext.parallelize(List(('d',1),('e',1),('c',1)))
rdd_16.subtract(rdd_17).collect
rdd_17.subtract(rdd_16).collect
(9)cartesian()
将两个集合的元素两两组合,笛卡尔积
val rdd8=spark.sparkContext.parallelize(List(1,3,5,3))
val rdd9=spark.sparkContext.parallelize(List(2,4,5,1))
rdd8.cartesian(rdd9).collect
三.行动操作
(1)collect()
返回数据集中所有元素
val data=spark.sparkContext.parallelize(List((1,3),(45,3),(7,6)))
sort_data.collect
(2)count(n)
返回数据集中所有元素个数
val data1=spark.sparkContext.parallelize(List(1,2,3))
data1.count
(3)take(n)
返回前n个元素
val data2=spark.sparkContext.parallelize(1 to 10)
data2.take(5)
(4) foreach()
rdd1.collect().foreach(println)
四.distinct()
用于RDD的数据去重
val rdd_3=spark.sparkContext.parallelize(List(('a',1),('a',1),('b',1),('c',1),('c',2)))
rdd_3.distinct().collect
五.sort()
用于数据排序
val data5=spark.sparkContext.parallelize(List((1,3),(45,3),(7,6)))
val sort_data5=data.sortBy(x=>x._2,false,1)
sql
Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象结构叫做DataFrame的数据模型(即带有Schema信息的RDD),Spark SQL作为分布式SQL查询引擎,让用户可以通过SQL、DataFrames API和Datasets API三种方式实现对结构化数据的处理。
Spark SQL的特点
(1)易整合
(2)统一的数据访问方式
(3)兼容Hive
(4)标准的数据连接
DataFrame
(1)创建DataFrame
show() | 显示前20条数据 |
show(numRows:Int) | 显示numRows条记录 |
show(truncate:Boolean) | 是否最多显示20个字符,默认为true |
show(numRow:Int,truncate:Boolean) | 显示numRows条记录并设置过长字符串的显示格式 |
(4)sort()
对id字段进行升序和降序排序
(5)select()
获取指定字段值
(6)selectExpr()
方法定义一个函数replace对对象中的id字段进行转换,将字段值替换
(7)groupBy():
对记录进行分组