大数据学习(二十二) DataFrame

简介

spark SQL部分,DF是很重要的一个操作单位。

DataFrame是组织成命名列的数据集。它在概念上等同于关系数据库中的表,但在底层具有更丰富的优化。DataFrames可以从各种来源构建:

  • 结构化数据文件
  • hive中的表
  • 外部数据库或现有RDDs

DataFrame和RDD区别

总的来说,DataFrame多了数据的结构信息,也就是schema,可以理解为每一个表的元数据或者说表结构信息。
他大体上就是这样一个关系:
DF= RDD + schema

优点:
DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化。

Datasets : DF之上的更高级抽象

Datasets是在Spark1.6中添加的一个新的接口。
首先Datasets提供了RDD的优点,强类型化,使用了lambda等等。
并且Datasets可以从JVM对象进行构造,兼容性更好,并且可以使用map等函数去操作。

DataFrames

总的来说有两种方法来创建DataFrames

(*)Case Class

  1. 定义case class,
    也就相当于schema,其中规定了表结构信息。
case class students(sid:String, sname:String, classNum:Int, comm:String)

非常简单和浅显吧。

  1. 读取数据(RDD)
    有了schema我们需要将数据也就是RDD对应到表结构中。
val data = sc.textFile("hdfs://myComputer:9000/braylon/test.csv").map(_.split(","))

val df = data.map(x => students(x(0).trim(),x(1).trim(),x(2).toInt,x(3).trim()))

其中比较重要的就是数据类型的转换,String的话就可以不用转换,但是对于Int的话就需要toInt变化。

  1. RDD -> DF
    我们上面得到的就是df,但是其实df仍然是一个RDD。这不是我们想要的DF。所以还需要一个转换。
val df2DF = df.toDF
//然后就可以查询和操作了,sparkSQL也就可以使用了
df2DF.show

(*)SparkSession创建DF
第二种方法是使用SparkSession

SparkSession

SparkSession是Apache Spark 2.x引入的,提供了一个统一的切入点来使用Spark的各项功能,并且提供DataFrame和DataSet相关的API操作。简化了用户操作Spark的监护流程。

比如对于1.x,我们需要建立SparkConf和SparkContext,SparkSession就简化了,不需要显示创建这两个对象,因为他们封装在了SparkSession中。

(*)
创建StructType,定义Schema结构信息。

val schema = StructType(List(StructField("sid", DataTypes.StringType),
	StructField("sname", DataTypes.StringType),
	StructField("classNum", DataTypes.IntegerType),
	StructField("comm", DataTypes.StringType)))

import org.apache.spark.sql.types._

val data = sc.textFile("hdfs://ip:9000/braylon/test.csv").map(_.split(","))
val df_ = data.map(x => Row(x(0),x(1),x(2).Int,x(3)))

//import org.apache.spark.sql.Row
val DF = spark.createDataFrame(df_,schema)

(*) Json文件创建DF

val df = spark.read.json("json文件")

DataFrame中使用SQL语句

  1. 创建视图
df.createOrReplaceTempView("students_tmp")
  1. 查询
spark.sql("select * from students_tmp").show

视图

上面使用的是一个在Session生命周期中的临时views。在Spark SQL中,如果拥有一个临时的view,并想在不同的Session中共享,而且在application的运行周期内可用,那么就需要创建一个全局的临时view。并记得使用的时候加上global_temp作为前缀来引用它,因为全局的临时view是绑定到系统保留的数据库global_temp上。

① 创建一个普通的view和一个全局的view

df.createOrReplaceTempView("tableView1")
df.createGlobalTempView("tableView2")

② 在当前会话中执行查询,均可查询出结果。

spark.sql("select * from tableView1").show
spark.sql("select * from global_temp.tableView2").show

③ 开启一个新的会话,执行同样的查询

spark.newSession.sql("select * from tableView1").show     (ERROR)
spark.newSession.sql("select * from global_temp.tableView2").show

大家共~~

发布了49 篇原创文章 · 获赞 52 · 访问量 8504

猜你喜欢

转载自blog.csdn.net/qq_40742298/article/details/104422214