Spark-sql入门案例-wordcount

文章目录

  • 一描述
  • 二 数据准备
  • 三 环境准备
  • 四 编码实现
  • 总结

一描述

对按照空格切分的文本文件中的内容进行解析,读取,按照单词进行统计,最后按照统计结果进行排序,保存到文件
具体的步骤:

  • 初始化Spark-sql对象
  • 读取文件内容
  • 对一行的数据进行处理
  • 分组统计结果排序
  • 保存至文件

二 数据准备

Spark-sql入门案例-wordcount_第1张图片
Spark-sql入门案例-wordcount_第2张图片

三 环境准备

新建spark-sql项目,导入pom依赖:

<dependencies>
		<dependency>
            <groupId>org.apache.sparkgroupId>
            <artifactId>spark-core_2.11artifactId>
            <version>2.1.1version>
        dependency>
        <dependency>
            <groupId>org.apache.sparkgroupId>
            <artifactId>spark-sql_2.11artifactId>
            <version>2.1.1version>
        dependency>
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.27version>
        dependency>
        <dependency>
            <groupId>org.apache.sparkgroupId>
            <artifactId>spark-hive_2.11artifactId>
            <version>2.1.1version>
        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()
  }
}

保存文件测试结果如下:
Spark-sql入门案例-wordcount_第3张图片
覆盖写至数据库测试结果如下:
Spark-sql入门案例-wordcount_第4张图片

总结

  • import spark.implicits._ 在df向Rdd 或者rdd 向df转换得时候 调用Rdd得函数得时候需要导入此隐式值 注意这个不是包名 是sparkSession实例化对象得名称
  • 调用write方法的时候默认的保存模式是SaveMode.ErrorIfExists 存在即报错
    还有三个值 Append (追加) Overwrite(覆盖) Ignore(忽略什么也不做,不建议用)

你可能感兴趣的:(大数据)