一、简写大致思路
1.写一个spark项目,将本地模式注释
2,不需要打印输出,而是用saveAsTextFile(“hdfs路径”)将文件保存到hdfs
3,将工程文件打包,上传到虚拟机spark下 exm --jars中,
4,提交spark任务到集群运行(不需要启动spark也可运行)
spark-submit --class 类的相对路径名(右击--copy Reference)--master 运行模式(yarn-client yarn-cluster) jar包名
5,命令查看
Hadoop dfs -cat 目标文件存储路径名 /*
二、案例代码: 注意包名不要导错!!!Java API删除hdfs文件调用了自定义utils工具类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import utils.HdfsDelete
object Text2 {
def main(args: Array[String]): Unit = {
/**
* 统计总成绩排名年级前十的各科的成绩
* */
//创建spark环境
val conf = new SparkConf()
//2,设置任务名
conf.setAppName("submit_shi")
// conf.setMaster("local")
//3,结合环境创建上下文对象
val sc = new SparkContext(conf)
//4,读取文件过滤并取出学号和分数
val newsco: RDD[(String, Int)] = sc
.textFile("/data/spark/score.txt")
.map(k => k.split(","))
.filter(k => k.length == 3)
.map {
case Array(nameid: String, _: String, sco: String) =>
(nameid, sco.toInt)
}
//5,根据key分组,罗列出每个学生的没课分数
val gbkey: RDD[(String, Iterable[Int])] = newsco.groupByKey()
//6,聚合分数,统计前十
val qianshi: Array[(String, Int)] = newsco
.reduceByKey((x: Int, y: Int) => x + y)
.sortBy(k => -k._2)
.take(10)
//7,将前十的集合转成RDD格式,与gbkey表join出前十所对应的各科目分数
val rddQianshi: RDD[(String, Int)] = sc.parallelize(qianshi)
val value: RDD[(String, (Int, Option[Iterable[Int]]))] = rddQianshi.leftOuterJoin(gbkey)
// value.foreach(println)
//8,判断hdfs路径是否存在,若存在就删除
HdfsDelete.delete("/data/spark/score_roe")
//9.将数据结果保存到hdfs自定义路径
value.saveAsTextFile("/data/spark/score_roe")
}
}
三、utils工具类代码:API删除hsfs上的文件
package utils
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
object HdfsDelete {
def delete(path:String): Unit = {
val configuration = new Configuration()
val system: FileSystem = FileSystem.get(configuration)
if (system.exists(new Path(path))){
system.delete(new Path(path),true)
}
}
}