1、DataFrame
DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema (表头)元信息 赖执行,但性能上比 RDD 要高, 主要原因:优化的执行计划,即查询计划通过 Spark catalyst optimiser 进行优化
2、DataSet
DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL 优化执行引擎的优点
3、RDD,DataFrame,DataSet
Spark1.0 => RDD
Spark1.3 => DataFrame
Spark1.6 => Dataset
(1)RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集 (2)三者都有惰性机制 (3)RDD 一般和 spark mllib 同时使用,RDD 不支持 sparksql 操作 (3)DataFrame 其实就是 DataSet 的一个特例
4、导包
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.5</version>
</dependency>
4、操作数据
SparkSession:程序的入口,2.0引入的 —read:读取数据统一使用read —schema:添加表头 —show:显示数据 —createOrReplaceTempView:创建视图,使用sql语句操作 —write:将文件写出去
object Demo01Sql {
def main(args: Array[String]): Unit = {
/**
* 使用SparkSession创建sql的入口 2.0引入
* 直接设置名称和local运行模式
*/
val spark: SparkSession = SparkSession.builder()
.appName("Demo01Sql")
.master("local")
//在触发shuffle后,后面的reduce默认为200,设置少一些
.config("spark.sql.shuffle.partitions","3")
.getOrCreate()
//从SparkSession中获取sparkContext上下文对象
//val sc: SparkContext = spark.sparkContext
//统一使用read方法去读取相应的文件格式(csv,jdbc,json...)
//读取文本数据没有表头,默认为_c0,_c1...
//使用schema添加表头
val stuDF = spark.read
.option("seq",",") //指定分隔符
.schema("id String,name String,age Int,gender String,clazz String")
.csv("sparkproject/data/students.txt")
//使用show直接打印,默认打印前20行
//打印100行,truncate参数为全显示,有些数据较长可能显示不完整
stuDF.show(10, truncate = false)
//使用sql去操作数据,创建一个临时的视图,表明为stu
stuDF.createOrReplaceTempView("stu")
//操作sql语句,sql查完返回DataFrame,转换算子
spark.sql("select * from stu where age>23")
.show()
//DSL的方式操作数据
stuDF.where("age>23")
.select("name","age","clazz")
.show()
//将文件写出去,write
//调mode方法可以指定SaveMode方式,追加,覆盖等
stuDF.groupBy("clazz")
.count()
.write
.mode(SaveMode.Overwrite)
.save("sparkproject/data/new_res")
}
}
|