一描述
对按照空格切分的文本文件中的内容进行解析,读取,按照单词进行统计,最后按照统计结果进行排序,保存到文件
具体的步骤:
- 初始化Spark-sql对象
- 读取文件内容
- 对一行的数据进行处理
- 分组统计结果排序
- 保存至文件
二 数据准备
三 环境准备
新建spark-sql项目,导入pom依赖:
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
四 编码实现
object SparkSqlFileRead {
def main(args: Array[String]): Unit = {
// 创建sparksession 对象
val spark =SparkSession.builder()
.appName("SparkSqlFileRead")
.master("local[2]")
.getOrCreate()
// 导入spark对象下的隐式转换
import spark.implicits._
// 通用方式读取文件内容
val df: DataFrame = spark.read.format("text").load("D:\\sparkDemo") //创建DataFrame对象
val wordDf: DataFrame = df.toDF("words") // 设置对应的字段名
//处理每行的数据
val ds: Dataset[String] = wordDf.flatMap(row => {
val word = row.getString(0)
val split = word.split(" ")
split
})
// 拼装元组
val dsMapOne: Dataset[(String, Int)] = ds.filter(!_.isEmpty)
.map((_,1))
//dsMapOne.show(10) // 查询出中间的10条数据
// +---------+---+
// | _1| _2|
// +---------+---+
// | spark| 1|
// | java| 1|
// | scala| 1|
// 对查询结果进行聚合
dsMapOne.toDF("word","wordSum").createOrReplaceTempView("tmp")
// spark.sql("select word,count(1) as `count` from tmp group by word order by `count` desc").show()
val resultDf = spark.sql("select word,count(1) as `count` from tmp group by word order by `count` desc")
// 保存至文件
// resultDf.write.format("csv").save("D:\\sparkSql") //通用方式
// resultDf.write.csv("D:\\\\sparkSql1") // 个别文件直接提供得有保存得方法
// 保存至mysql中
//通用方式
// resultDf.write.format("jdbc")
// .option("user","root")
// .option("url", "jdbc:mysql://localhost:3306/sparkdemo") //数据库连接地址
// .option("password","root")
// .option("dbtable","wordCount") // 表名
// .mode(SaveMode.Append) // 保存模式
// .save()
//使用提供好的函数
val pro: Properties = new Properties()
pro.setProperty("user","root")
pro.setProperty("password","root")
resultDf.write
.mode(SaveMode.Overwrite)
.jdbc(
"jdbc:mysql://localhost:3306/sparkdemo",
"wordCount",
pro
)
spark.stop()
}
}
保存文件测试结果如下:
覆盖写至数据库测试结果如下:
总结
- import spark.implicits._ 在df向Rdd 或者rdd 向df转换得时候 调用Rdd得函数得时候需要导入此隐式值 注意这个不是包名 是sparkSession实例化对象得名称
- 调用write方法的时候默认的保存模式是SaveMode.ErrorIfExists 存在即报错
还有三个值 Append (追加) Overwrite(覆盖) Ignore(忽略什么也不做,不建议用)