数据通过解析后被存放成case class类型,如果想要提取处理,就需要将数据转换成df toDF()
而一旦转换成DF 对应的表头字段和case class中的相对应,df的一些有趣操作,
ratingsData.toDF().filter($"rating" > 4).select("product").rdd.map((_, 1)).reduceByKey(_ + _).sortBy(_._2, false).map(_._1).take(100),其实我是想求一个聚合函数,一时竟想不起来该怎么做了,索性转成rdd变成求wordcount
其实可以这么解决 通过注册成临时表 然后通过sql语句查询 ,df只有注册成临时表才能像sql那样查询,
spark.sql("select product,count(*) from A group by product ")简单的分组聚合累加
或者直接通过 df提供的方法ratingsData.toDF().filter($"rating" > 4).groupBy("product").count().createTempView("A")
groupBy("product".count())免去了注册临时表的麻烦 createTempView
在此需要提示一下,临时表分为好几种,如果是global 的需要在前面加上global_temp.xxx否则会报找不到此表
val predictResultOfTestSet = recomModel.predict(testSetOfRatingData.map {
case Rating(user, product, rating) => (user, product)
})
val formatResultOfTestSet = testSetOfRatingData.map {
case Rating(user, product, rating) => ((user, product), rating)
}
scala的强大之处case class模式匹配 如果对应与这样则转换成指定的格式 testSetOfRatingData.map {
case Rating(user, product, rating) => (user, product) 其实不需要这么麻烦,
map(x=>(x.user,x.product))即可
rdd的cache 和persist
从源码看cache是直接调用的persist,cache的默认存储级别为memory,而persist可以通过传入存储级别改变
spark-env调优
spark_worker_cores 总共的核数允许spark ,默认全部
spark_worker_momoey 默认总内存减去1G
master_port 7077 webui 8080
spark中的一些概念:Aplication应用就是一个spark-submit提交的一个任务被称之为Application应用
stage划分 宽依赖 窄依赖 如果父rdd进入一个窄依赖否则宽依赖
用户提交的应用程序代码在spark中运行起来就是一个driver,
spark on yarn有两种方式 cluster client cluster一般用于生产环境,client用于交互测试。主要区别是 ,client的driver运行在客户端进程中,后者的driver运行在nodemanager的applicationmaster中,driver负责分发作业的,由于client模式driver在客户端上,客户端可能与executor,不再同一局域网中,通信会很慢
提交作业时yarn会将spark jars分发到yarn的container中,这十分耗费资源,故而我们可以将spark jars放在一个yarn可以访问到的目录中,具体做法如下:
vi spark-default.cong 添加
spark.yarn.jars hdfs://ip:8021/somepath/*
保存生效,并将所有的spark jars上传至hdfs://ip:9000/somepath/即可。
spark对于同时运行的作业数目有一定的限制,该限制由参数"spark.port.maxRetries"决定,该参数默认值为16,表明同一时间运行的作业最多为17个(不是16个哦),生产上16肯定太小,我们可以更改这一数字,具体做法如下: