spark编程笔记

表达能力
MapReduce需要将所有计算转换为Map和Reduce,难以描述复杂处理过程;
Spark除Map和Reduce外,还支持RDD/DataFrame/DataSet等多种数据模型操作,编程模型更加灵活。
磁盘IO
MapReduce每步运算都要从磁盘读取数据,结束后写入磁盘数据,仅有小部分数据作为临时缓存放入内存,磁盘IO开销比较大;
Spark将中间结果直接放入内存,既提高了迭代运算效率,又避免了大量的重复计算,据官方提供数据,同样迭代运算效率Spark:Hadoop=110:0.9。
任务延迟
MapReduce将任务分成一系列运算顺序执行,每次运算涉及磁盘IO,任务间衔接不及时,需要等上步完成才能进行下步运算,无法满足复杂任务和多阶段计算任务需求;
Spark基于DAG任务调度执行机制,不涉及磁盘IO延迟,迭代运算更快。
内存管理
MapReduce任务在启动时已经在JVM内指定了最大内存,不能超过指定的最大内存;
Spark在超过指定最大内存后,会使用操作系统内存,既保证了内存的基本使用,又避免了提早分配过多内存带来的资源浪费
并行处理
MapReduce中一个进程运行一个task,按序执行;
Spark中一个线程运行一个task,增加了并行度。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
MapReduce是Apache Hadoop中用于大规模数据集计算的并行计算框架,目前被广泛应用于企业的离线数据处理上。但是因为种种原因,MapReduce的性能并不理想。而Spark作为数据处理框架界的后起之秀,很多方面都超过了MapReduce。下面来列出MapReduce的不足以及Spark对其的改进。
MapReduce:
    仅支持Map和Reduce两种操作
    Map中间结果需要写磁盘
    任务调度和启动开销大
    无法充分利用内存
    Map和Reduce都需要排序
    不适合迭代计算
Spark:
    丰富的API(Java、Scala、Python、R四种语言,sort、join等高效算子)
    DAG执行引擎,中间结果不落盘
    线程池模型减少task启动开销
    充分利用内存,减少磁盘IO
    避免不必要的排序操作
    适合迭代计算,比如机器学习算法
当然,Spark相比MapReduce还是有一个明显的缺点,就是内存的消耗是比较大的。在超大规模数据集离线计算并且时效性要求不高的情况下可以考虑优先使用MapReduce。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
单词计数
val textFile = sc.textFile("words.txt")
val wordCount = textFile.flatMap(line => line.split("[ |,|.|?|]")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCount.collect
wordCount.filter(_._2>3).collect
wordCount.filter(_._2>3).saveAsTextFile("saveWords.txt")
val textFile=sc.textFile("saveWords.txt")
textFile.collect
统计文本中性别为“男”的用户数
Spark编程环境下:
val textFile=sc.textFile("test.txt")
textFile.count
textFile.filter(line=>line.contains("男")).count
textFile.filter(line=>line.contains("男")).map(line=> (line.split(' ')(0),1)).reduceByKey(_+_).collect
//
 spark-submit --master yarn-cluster --class demo.spark.WordCount /home/hadoop/Downloads/wordcount.jar words.txt word_count
//
hive --service metastore &
val sqlContext=new org.apache.spark.sql.SQLContext(sc)
val hiveContext=new org.apache.spark.sql.hive.HiveContext(sc)
//
RDD创建DataFrame{
case class Person(name:String,age:Int)
val data=sc.textFile("sparkSql/people.dat").map(_.split("::"))
val people=data.map(p=>Person(p(0),p(1).trim.toInt)).toDF()
people.printSchema
//
val people=sc.textFile("sparkSql/people.dat")
val schemaString="UserID Gender Age Occupation Zip-code"
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{StructType,StructField,StringType}
val schema=StructType(schemaString.split(" ").map(fieldName=>StructField(fieldName,StringType,true)))
val rowRDD=people.map(_.split("::")).map(p=>Row(p(0),p(1),p(2),p(3),p(4).trim))
val peopleDataFrame=sqlContext.createDataFrame(rowRDD,schema)
}
val dfCsv = spark.read.format("csv").option("header", true).load("people.csv")
dfCsv.show()
//
CREATE TABLE city_info(
  city_id bigint,
  city_name string,
  area string)
row format delimited fields terminated by '\t';
//
1. 先把需要的字段查出来
create t1 as
select
    ci.*,
    pi.product_name,
    click_product_id
from user_visit_action uva
join product_info pi on uva.click_product_id=pi.product_id
join city_info ci on uva.city_id=ci.city_id
2. 按照地区和商品名称聚合
create t2 as
select
    area,
    product_name,
    count(*)  count
from t1
group by area , product_name
3. 按照地区进行分组开窗 排序 开窗函数
create t3 as
select area, product_name, count, rank() over(partition by area order by count desc)
from  t2
4. 过滤出来名次小于等于3的(不去重)
create t4 as
select
    area,
    product_name,
    count
from  t3
where rk <=3
//
v1
select area, product_name, count(*) click_num
from(select
    ci.area,
    ci.city_name,
    pi.product_name,
    click_product_id
from user_visit_action uva
join product_info pi on uva.click_product_id=pi.product_id
join city_info ci on uva.city_id=ci.city_id)
group by area, product_name
order by area, click_num

t1
select area, city_name, product_name, count(*) click_num
from(select
    ci.area,
    ci.city_name,
    pi.product_name,
    click_product_id
from user_visit_action uva
join product_info pi on uva.click_product_id=pi.product_id
join city_info ci on uva.city_id=ci.city_id)
group by area, city_name, product_name
order by area, city_name, click_num
//
v2
select area, product_name, click_num
from (select area, product_name, click_num, rank() over(partition by area order by click_num desc) as rank from v1) as t1
where rank <= 3
//
v3
select t1.area, t1.city_name, t1.product_name, t1.click_num
from t1 join v2 on t1.area = v2.area and t1.product_name = v2.product_name
order by t1.area, t1.city_name, t1.click_num
//
create view v4 as
select area, product_name, city_name, click_num
from v3
group by area, product_name, city_name, click_num
order by area, product_name, city_name, click_num
//
select area, product_name, city_name, click_num
from(select area, product_name, city_name, click_num , rank() over(partition by (area, product_name) order by click_num desc) as rank
from v4)
where rank <= 2
order by area, product_name

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值