Spark-Sql之DataFrame实战详解
1、DataFrame简介:
在Spark中,DataFrame是一种以RDD为基础的分布式数据据集,类似于传统数据库听二维表格,DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。
类似这样的
root
|-- age: long (nullable = true)
|-- id: long (nullable = true)
|-- name: string (nullable = true)
2、准备测试结构化数据集
people.json
{"id":1, "name":"Ganymede", "age":32}
{"id":2, "name":"Lilei", "age":19}
{"id":3, "name":"Lily", "age":25}
{"id":4, "name":"Hanmeimei", "age":25}
{"id":5, "name":"Lucy", "age":37}
{"id":6, "name":"Tom", "age":27}
3、通过编程方式理解DataFrame
1) 通过DataFrame的API来操作数据
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.log4j.Level
import org.apache.log4j.Logger object DataFrameTest {
def main(args: Array[String]): Unit = {
//日志显示级别
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.ERROR) //初始化
val conf = new SparkConf().setAppName("DataFrameTest")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.json("people.json") //查看df中的数据
df.show()
//查看Schema
df.printSchema()
//查看某个字段
df.select("name").show()
//查看多个字段,plus为加上某值
df.select(df.col("name"), df.col("age").plus(1)).show()
//过滤某个字段的值
df.filter(df.col("age").gt(25)).show()
//count group 某个字段的值
df.groupBy("age").count().show() //foreach 处理各字段返回值
df.select(df.col("id"), df.col("name"), df.col("age")).foreach { x =>
{
//通过下标获取数据
println("col1: " + x.get(0) + ", col2: " + "name: " + x.get(2) + ", col3: " + x.get(2))
}
} //foreachPartition 处理各字段返回值,生产中常用的方式
df.select(df.col("id"), df.col("name"), df.col("age")).foreachPartition { iterator =>
iterator.foreach(x => {
//通过字段名获取数据
println("id: " + x.getAs("id") + ", age: " + "name: " + x.getAs("name") + ", age: " + x.getAs("age")) })
} }
}
2)通过注册表,操作sql的方式来操作数据
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.log4j.Level
import org.apache.log4j.Logger /**
* @author Administrator
*/
object DataFrameTest2 {
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR);
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.ERROR); val conf = new SparkConf().setAppName("DataFrameTest2")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.json("people.json") df.registerTempTable("people") df.show();
df.printSchema(); //查看某个字段
sqlContext.sql("select name from people ").show()
//查看多个字段
sqlContext.sql("select name,age+1 from people ").show()
//过滤某个字段的值
sqlContext.sql("select age from people where age>=25").show()
//count group 某个字段的值
sqlContext.sql("select age,count(*) cnt from people group by age").show() //foreach 处理各字段返回值
sqlContext.sql("select id,name,age from people ").foreach { x =>
{
//通过下标获取数据
println("col1: " + x.get(0) + ", col2: " + "name: " + x.get(2) + ", col3: " + x.get(2))
}
} //foreachPartition 处理各字段返回值,生产中常用的方式
sqlContext.sql("select id,name,age from people ").foreachPartition { iterator =>
iterator.foreach(x => {
//通过字段名获取数据
println("id: " + x.getAs("id") + ", age: " + "name: " + x.getAs("name") + ", age: " + x.getAs("age")) })
} }
}
两种方式运行结果是一样的,第一种适合程序员,第二种适合熟悉sql的人员。
4、对于非结构化的数据
people.txt
1,Ganymede,32
2, Lilei, 19
3, Lily, 25
4, Hanmeimei, 25
5, Lucy, 37
6, wcc, 4
1) 通过字段反射来映射注册临时表
import org.apache.spark.sql.SQLContext import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.log4j.Level
import org.apache.log4j.Logger
import org.apache.spark.sql.types.IntegerType
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.Row /**
* @author Administrator
*/
object DataFrameTest3 {
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR);
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.ERROR); val conf = new SparkConf().setAppName("DataFrameTest3")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val people = sc.textFile("people.txt") val peopleRowRDD = people.map { x => x.split(",") }.map { data =>
{
val id = data(0).trim().toInt
val name = data(1).trim()
val age = data(2).trim().toInt
Row(id, name, age)
}
} val structType = StructType(Array(
StructField("id", IntegerType, true),
StructField("name", StringType, true),
StructField("age", IntegerType, true))); val df = sqlContext.createDataFrame(peopleRowRDD, structType); df.registerTempTable("people") df.show()
df.printSchema() }
}
2) 通过case class反射来映射注册临时表
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.log4j.Level
import org.apache.log4j.Logger
import org.apache.spark.sql.types.IntegerType
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.Row /**
* @author Administrator
*/
object DataFrameTest4 {
case class People(id: Int, name: String, age: Int)
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR);
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.ERROR); val conf = new SparkConf().setAppName("DataFrameTest4")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val people = sc.textFile("people.txt") val peopleRDD = people.map { x => x.split(",") }.map { data =>
{
People(data(0).trim().toInt, data(1).trim(), data(2).trim().toInt)
}
} //这里需要隐式转换一把
import sqlContext.implicits._
val df = peopleRDD.toDF()
df.registerTempTable("people") df.show()
df.printSchema() }
}
5、总结:
Spark SQL是Spark中的一个模块,主要用于进行结构化数据的处理。它提供的最核心的编程抽象,就是DataFrame。同时Spark SQL还可以作为分布式的SQL查询引擎。Spark SQL最重要的功能之一,就是从Hive中查询数据。
DataFrame,可以理解为是,以列的形式组织的,分布式的数据集合。它其实和关系型数据库中的表非常类似,但是底层做了很多的优化。DataFrame可以通过很多来源进行构建,包括:结构化的数据文件,Hive中的表,外部的关系型数据库,以及RDD。
Spark-Sql之DataFrame实战详解的更多相关文章
- Spark SQL底层执行流程详解
本文目录 一.Apache Spark 二.Spark SQL发展历程 三.Spark SQL底层执行原理 四.Catalyst 的两大优化 一.Apache Spark Apache Spark是用 ...
- Scala 深入浅出实战经典 第61讲:Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第60讲:Scala中隐式参数实战详解以及在Spark中的应用源码解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Spark SQL知识点与实战
Spark SQL概述 1.什么是Spark SQL Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块. 与基本的Spark RDD API不同,Sp ...
- NHibernate实战详解(二)映射配置与应用
关于NHibernate的资料本身就不多,中文的就更少了,好在有一些翻译文章含金量很高,另外NHibernate与Hibernate的使用方式可谓神似,所以也有不少经验可以去参考Hibernate. ...
- Scala 深入浅出实战经典 第78讲:Type与Class实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第64讲:Scala中隐式对象代码实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第58讲:Scala中Abstract Types实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第55讲:Scala中Infix Type实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
随机推荐
- 解决ODI 12C Studio 运行缓慢问题
一.配置 ODI 12C Studio 1.1 修改ODI Studio process的-Xms和-Xmx ide.conf: modifying the initial Heap size (-X ...
- LeetCode118:Pascal's Triangle
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...
- Centos下和Win7下查看端口占用情况
Centos #会列出所有正在使用的端口及关联的进程/应用 netstat -nap #portnumber要用具体的端口号代替,可以直接列出该端口听使用进程/应用 lsof -i :portnumb ...
- 转:体积阴影(Shadow Volumes)生成算法
下面以最快的速度简单谈谈阴影生成技术,目前普遍采用的一般有三种:Planar Shadow.Shadow Mapping和Shadow Volume,前者类似投影,计算最简单,缺点只能绘制抛射在平面上 ...
- Android控件进阶-自定义流式布局和热门标签控件
技术:Android+java 概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...
- centos7用xshell可以连接, xftp连接失败!(墙裂推荐)
环境: vultr vps搭建的是centos7 毛病: xshell可以连接, 打开xftp配置好连接却连接失败如下图: 然后开始设置ssh的配置文件vim /etc/ssh/sshd_confi ...
- [转]TensorFlow---岂止深度学习
原文链接 TensorFlow不仅可以用于深度学习自动求导,它也可用于构建传统机器学习和经典算法. TensorFlow提供了"一揽子"常用数值计算和机器学习算法的构建模块.在本文 ...
- LAMP环境搭建实现网站动静分离[转]
目录: 1.环境概述 2.动静分离拓扑图 3.各服务器功能规划 4.各服务器基础环境配置 5.httpd安装配置 6.php安装配置及启用opcache加速功能 7.mysql安装配置 8.wordp ...
- 高性能Web服务之lnmp架构应用
传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下.生成一个新的进程/线程需要事先备好其运 ...
- 【Spring】Spring之依赖注入(DI)传递参数的方式
DI依赖注入传入参数的方式,这里介绍了基本数据类型,集合,符合数据类型的传递(String类型比较特殊,其传递值和基本数据类型的方法一致) 注入基本数据类型和String类型 通过setter方法注入 ...