Spark-sql入门案例-wordcount

一描述

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

  • 初始化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(忽略什么也不做,不建议用)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_slaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值