(一)sparkSQL
sparkSQL是什么
sparkSQL是apache spark的一个处理结构化数据的模块。
它提供了一个编程抽象叫做DataFrame 并且作为分布式sql查询引擎的作用
sparkSQL四大特性
- 1.易整合
- 可以将sparksql与spark应用程序进行混合使用
- 并且可以使用java、scala、python、R等不同语言进行代码开发
- 2.统一的数据源访问
- sparksql可以使用一种相同的方式跟不同的外部数据源进行对接
- SparkSession.read.文件格式(“该文件的路径”)
- 3.兼容hive
- sparksql支持hivesql的语法
- 4.支持标准数据库连接
- sparksql可以使用标准的jdbc或者odbc连接上数据库
(二)DataFrame
什么是DataFrame
DataFrame以RDD为基础的分布式数据集。
类似于传统数据库的二维表格,DataFrame带有Schema元信息,即DataFrame所表示的二维数据表的每一列都带有名称和类型,但底层做了更多的优化。
DataFrame可以从很多数据源构建,比如已经存在的RDD、结构化文件、外部数据库、hive表。
rdd与dataframe优缺点对比
-
rdd
- 优点
- 1.编译时类型安全
- 就是后期再编译rdd代码的时候,会进行类型检查
- 2.具有面向对象的编程风格
- 可以使用对象调用方法的形式去操作对象
- 1.编译时类型安全
- 缺点
- 1.数据对象序列化和反序列化性能开销很大
- spark任务通过分布式计算实现,后期大量的task运行,需要大量的数据网络传输。
- 2.大量的对象创建会带来大量的GC(垃圾回收)
- 在通过rdd进行编程的时候可能会创建大量对象,这些对象都是构建在jvm堆里的,需战大量内存空间,后期内存不足会导致频繁GC,GC结束后,任务继续运行。
- 1.数据对象序列化和反序列化性能开销很大
- 优点
-
DataFrame
-
它分别引入了schema和off-heap解决了rdd的缺点,同时也丢失了rdd的优点
-
优点
-
1.schema:就是对数据结构信息的描述。后期这里数据在进行网络传输的时候,只需要序列化数据本身就可以了,性能得到提升;
它是解决了rdd中数据对象序列化和反序列化性能开销很大这个缺点。
-
2.off-heap:不在jvm堆内存中构建对象,使用操作系统层面上的内存,不会频繁导致gc;
解决了rdd大量的对象创建会带来大量的GC这个缺点。
-
-
DataFrame解决了rdd的缺点,同时也丢失了rdd的优点
- 1.DataFrame编译时类型不安全
- 2.DataFrame不具备面向对象编程风格
-
读取数据源构建DataFrame
1.读取文本文件构建DataFrame
val df=spark.read.text("/sparkdata/input/word.txt")
//打印schema
df.printSchema
//展示数据
df.show
2.读取json文件构建DataFrame
val df=spark.read.json("/sparkdata/input/person.json")
//打印schema
df.printSchema
//展示数据
df.show
3.读取parquet列式存储文件构建DataFrame
val df=spark.read.parquet("/sparkdata/input/users.parquet")
//打印schema
df.printSchema
//展示数据
df.show
实例
scala> val df=spark.read.text("/sparkdata/input/word.txt")
df: org.apache.spark.sql.DataFrame = [value: string]
scala> df.printSchema
root
|-- value: string (nullable = true)
scala> df.show
+------------------+
| value|
+------------------+
|spark hadoop hbase|
| hadoop spark|
| hello|
+------------------+
scala>
DataFrame常用操作
1.DSL风格语法
-
dataframe自身提供了一套api,可以通过这套api去操作它
val rdd1=sc.textFile("/person.txt") val rdd2=rdd1.map(_.split(" ")) //抽象类 case class Person(id:Int,name:String,age:Int) val rdd3=rdd2.map(x=>Person(x(0).toInt,x(1),x(2).toInt)) val df=rdd3.toDF df.printSchema df.show df.select("name").show df.select($"name").show df.select(col("name")).show df.select("name","age").show df.select($"age"+1).show df.filter($"age">30).show df.filter($"age">30).show df.groupBy("age").count.show
2.SQL风格语法
-
就是可以把datFrame看成是一张表
-
需要把dataframe注册成一张表
//spark-shell df.createTempView("person")
-
SparkSession.sql (sql语句)
spark.sql("select * from person").show spark.sql("select * from person where id=1").show spark.sql("select count(*) from person where age>30").show
//IDEA依赖包 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scala.binary.version}</artifactId> <version>2.2.0</version> </dependency>
-
(三)DataSet
dataset是什么
dataset是分布式的数据集合。
它提供了强类型支持,也是在rdd的每行数据加了类型约束。
spark1.6之后的接口。
它集中了rdd的优点(强类型和可以用强大的lambda函数)以及使用了spark sql优化的执行引擎。
DataSet和DataFrame互相转换
- 1.DataFrame------>DataSet
- val ds=df.as[强类型]
- 2.DataSet-------->DataFrame
- val df=ds.toDF
- 补充
- 可以使用DataFrame和DataSet分别调用各自rdd方法,将其转换为一个rdd
如何构建DataSet
-
1、从一个已经存在的scala集合去构建
scala> val ds=spark.createDataset(List(1,2,3,4)) scala> val ds=List(1,2,3,4).toDS
-
2、从一个已经存在的rdd去构建
scala> val ds=spark.createDataset(sc.textFile("/sparkdata/word.txt"))
-
3、DataFrame转换成DataSet
val ds=df.as[String]
-
4、通过一个DataSet转换生成一个新的DataSet
scala> val ds2=ds.map(x=>x+"_itcast")
(四)SparkSQL DataFrame DataSet三者的数据类型
附:
//spark.+TAB
scala> spark.
baseRelationToDataFrame emptyDataset readStream streams
catalog experimental sessionState table
close implicits sharedState time
conf listenerManager sparkContext udf
createDataFrame newSession sql version
createDataset range sqlContext
emptyDataFrame read stop
//sc.+TAB
scala> sc.
accumulable getCheckpointDir parallelize
accumulableCollection getConf range
accumulator getExecutorMemoryStatus register
addFile getExecutorStorageStatus removeSparkListener
addJar getLocalProperty requestExecutors
addSparkListener getPersistentRDDs requestTotalExecutors
appName getPoolForName runApproximateJob
applicationAttemptId getRDDStorageInfo runJob
applicationId getSchedulingMode sequenceFile
binaryFiles hadoopConfiguration setCallSite
binaryRecords hadoopFile setCheckpointDir
broadcast hadoopRDD setJobDescription
cancelAllJobs isLocal setJobGroup
cancelJob isStopped setLocalProperty
cancelJobGroup jars setLogLevel
cancelStage killExecutor sparkUser
clearCallSite killExecutors startTime
clearJobGroup killTaskAttempt statusTracker
collectionAccumulator listFiles stop
defaultMinPartitions listJars submitJob
defaultParallelism longAccumulator textFile
deployMode makeRDD uiWebUrl
doubleAccumulator master union
emptyRDD newAPIHadoopFile version
files newAPIHadoopRDD wholeTextFiles
getAllPools objectFile