概述
1.sparkSQL概述
sparkSQL是spark的一个模块,可以和RDD进行混合编程、支持标准的数据源、可以集成和替代Hive、可以提供JDBCODBC服务器功能。
sparkSQL里面有两个新的数据抽象:DataFrame和DataSet。
DataFrame:
SQL操作主要涉及到表的操作,表是数据和schema组成的,所以可以认为DataFrame就是一张表 = RDD+Schema。
DataFrame的执行效率比RDD要高,主要表现在定制化的内存管理和优化的执行引擎。
DataFrame是一个弱类型的数据对象,缺少数据类型安全检查,运行期检查,类似于java.sql.ResultSet类,只能通过getString这种方式来获取具体数据。
DataSet:
type DataFrame = DataSet[Row]
DataSet具有DataFrame所有好处,同时配合case class来实现强类型,具有局部序列化和反序列化功能。
RDD和DataFrame和DataSet之间可以进行数据转换。
2.数据转换
sparkSQL初探
1.sparksql读取json,需要一行是一个json。
scala> val employee = spark.read.json("/opt/module/spark-2.1.1-bin-hadoop2.7/examples/src/main/resources/people.json")
2.通过创建SparkSession来使用SparkSQL。
package com.dengdan.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
object SparkSqlHello extends App {
//初始化
val sparkConf = new SparkConf().setAppName("sparksql").setMaster("local[*]")
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
val sc = spark.sparkContext
//--------------------业务逻辑 start----------------------------------
val employee = spark.read.json("")
employee.show()
employee.select("name").show()
employee.createOrReplaceTempView("employee")
spark.sql("select * from employee").show()
//--------------------业务逻辑 end----------------------------------
spark.stop()
}
RDD与DataFrame之间的转换
需要导入隐式转换,在spark-shell环境下:import spark.implicits._
【spark
不是包名,而是sparkSession对象的名称。】
RDD->DataFrame:
确定Schema。有三种方式:
1.直接手动确定。
peopleRDD.map{x=>
val para= x.split(“,”)
(para(0),para(1).trim.toInt)
}.toDF(“name”,”age”)
2.通过反射确定。
利用case class People(name:String, age:Int)
scala> case class People(name:String,age:Int)
scala> val peopleRdd = sc.textFile("examples/src/main/resources/people.txt")
scala> peopleRdd.map{x=> val para = x.split(",");People(para(0),para(1).trim.toInt)}.toDF
3.通过编程方式来确定。
val peopleRdd = sc.textFile("examples/src/main/resources/people.txt")
import org.apache.spark.sql.types._
//准备Schema
val schema = StructType(StructField("name",StringType)::StructField("age",IntegerType)::Nil)
import org.apache.spark.sql._
//准备data【需要Row类型】
val data = peopleRdd.map{x=> val para = x.split(",");Row(para(0),para(1).trim.toInt)}
//生成dataFrame
val dataFrame= spark.createDataFrame(data,schema)
dataFrame.show
DataFrame-> RDD:
dataFrame.rdd即可,返回的是RDD[Row]。
RDD与DataSet之间的转换
1.RDD->DataSet:
(case class 确定Schema)
case class People(name:String,age:Int)
peopleRdd.map{x=> val para = x.split(",");People(para(0),para(1).trim.toInt)}.toDS
2.DataSet->RDD:
dataSet.rdd即可,返回的RDD[People]
DataFrame与DataSet之间的转换
1.DataSet->DataFrame
(强类型->弱类型)
dataSet.toDF 即可,直接复用case class的名称。
2.DataFrame ->DataSet
(Schema需要借助case class)【DF的列名要和case class的列名一致。】
case class People(name:String,age:Int)
dataFrame.as[People]
即可。
最后
以上就是忧心黄蜂为你收集整理的spark-10.sparkSQL_1_sparkSQL概述与数据转换1.sparkSQL概述2.数据转换的全部内容,希望文章能够帮你解决spark-10.sparkSQL_1_sparkSQL概述与数据转换1.sparkSQL概述2.数据转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复