我是靠谱客的博主 忧心黄蜂,最近开发中收集的这篇文章主要介绍spark-10.sparkSQL_1_sparkSQL概述与数据转换1.sparkSQL概述2.数据转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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.数据转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部