• 大三寒假学习进度(十八)


    今天主要学习了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抽象出的两个方便我们进行操作的概念,理解起来难度还是不是很大的

    总结

  • 相关阅读:
    70.BOM
    69.捕获错误try catch
    68.键盘事件
    523. Continuous Subarray Sum
    901. Online Stock Span
    547. Friend Circles
    162. Find Peak Element
    1008. Construct Binary Search Tree from Preorder Traversal
    889. Construct Binary Tree from Preorder and Postorder Traversal
    106. Construct Binary Tree from Inorder and Postorder Traversal
  • 原文地址:https://www.cnblogs.com/hang-hang/p/14871791.html
Copyright © 2020-2023  润新知