spark-10.sparkSQL_1_sparkSQL概述与数据转换

1.sparkSQL概述

sparkSQL是spark的一个模块,可以和RDD进行混合编程、支持标准的数据源、可以集成和替代Hive、可以提供JDBC\ODBC服务器功能。
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] 

即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值