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