大三寒假学习进度笔记(二十一)—— 聚类与SparkSQL入门

写在前面

今天主要学习了SparkSQL的基础概念,然后学习了一下机器学习中的聚类。

机器学习部分

聚类,就是将一组数据中集中相似的样本进行分类。属于机器学习中的无监督学习方法(没有目标值y)。今天主要学习了一下K-Means算法。K-Means算法是聚类中一个十分常见的算法。

最后,通过Python自己实现了一个K-Means算法。

Spark部分

今天学习了一下SparkSQL的简单入门,首先导入依赖:

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.0.1</version>
        </dependency>

我这里使用的是3.0.1的Spark。
然后就可以开始使用SparkSQL了:

/**
 * @Description:
 * @author: LiuGe
 * @date: 2021/1/30
 */
object Spark01_SparkSQL_Basic {

  def main(args: Array[String]): Unit = {

    // 创建SparkSQL的运行环境
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("sparkSQL")
    val spark = SparkSession.builder().config(sparkConf).getOrCreate()
    import spark.implicits._
    // 执行逻辑操作
    // RDD

    // DataFrame
//    val df: DataFrame = spark.read.json("datas/user.json")
//    df.show()

    // DataFrame => SQL
//    df.createOrReplaceTempView("user")
//    spark.sql("select * from user").show()
//    spark.sql("select age from user").show()
//    spark.sql("select avg(age) from user").show()

    // DataFrame => DSL
    // 在使用DataFrame时,如果涉及到转换操作,需要引入转换规则

//    df.select("age","username").show()
//    df.select($"age" + 1).show()
//    df.select('age + 1).show()

    // DataSet
    // DataFrame其实是特定泛型的DataSet
//    val seq = Seq(1,2,3,4)
//    val ds: Dataset[Int] = seq.toDS()
//    ds.show()

    // RDD <=> DataFrame
    val rdd = spark.sparkContext.makeRDD(List((1,"zhangsan",30),(2,"lisi",40)))
    val df: DataFrame = rdd.toDF("id", "name", "age")
    val rowRDD: RDD[Row] = df.rdd

    // DataFrame <=> DataSet
    val ds: Dataset[User] = df.as[User]
    val df1: DataFrame = ds.toDF()
    // RDD <==> DataSet
    val ds1: Dataset[User] = rdd.map {
      case (id, name, age) => {
        User(id, name = name, age = age)
      }
    }.toDS()
    val userRDD: RDD[User] = ds1.rdd
    // 关闭
    spark.close()
  }
  case class User(id:Int,name:String,age:Int)
}

这里涉及几个核心概念:DataSet、DataFrame:

DataFrame: 在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构信息,从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化,最终达到大幅提升运行时效的的目标。反观 RDD,由于无从得知所存数据元素的具体内部结构,Spark Core 只能在 stage 层面进行简单、通用的流水线优化。

DataSet: DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL优化执行引擎的优点。DataSet 也可以使用功能性的转换(操作 map,flatMap,filter等等)

总的来说,这就是Spark抽象出的两个方便我们进行操作的概念,理解起来难度还是不是很大的

总结

今天主要学习了SparkSQL以及机器学习中的聚类。

原文地址:https://www.cnblogs.com/wushenjiang/p/14350711.html