Spark_总结四
Spark_总结四
1.Spark SQL
3.创建DataFrame的来源和方式 || 如何对DataFrame中封装的数据进行操作?
3.2如何对DataFrame中封装的数据进行操作?
package com.hzf.spark.exercise;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;
publicclassTestSparkSQL02{
publicstaticvoid main(String[] args){
SparkConf conf =newSparkConf().setAppName("DataFrameOps").setMaster("local");
JavaSparkContext sc =newJavaSparkContext(conf);
SQLContext sqlContext =newSQLContext(sc);
DataFrame df = sqlContext.read().json("people.json");
/*
* 操作DataFrame的第一种方式
* */
//类似 SQL的select from table;
df.show();
//desc table
df.printSchema();
//select age from table;
df.select("age").show();
//select name from table;
df.select("name").show();
//select name,age+10 from table;
df.select(df.col("name"),df.col("age").plus(10)).show();
//select * from table where age > 20
df.filter(df.col("age").gt(20)).show();
}
}
package com.hzf.spark.exercise;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;
publicclassTestSparkSQL01{
publicstaticvoid main(String[] args){
SparkConf conf =newSparkConf().setAppName("DataFrameOps").setMaster("local");
JavaSparkContext sc =newJavaSparkContext(conf);
SQLContext sqlContext =newSQLContext(sc);
DataFrame df = sqlContext.read().json("people.json");
//将DataFrame中封装的数据注册为一张临时表,对临时表进行sql操作
df.registerTempTable("people");
DataFrame sql = sqlContext.sql("SELECT * FROM people WHERE age IS NOT NULL");
sql.show();
}
}
package com.bjsxt.java.spark.sql.json;
import java.util.ArrayList;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import scala.Tuple2;
/**
* JSON数据源
* @author Administrator
*
*/
publicclassJSONDataSource{
publicstaticvoid main(String[] args){
SparkConf conf =newSparkConf()
.setAppName("JSONDataSource")
// .set("spark.default.parallelism", "100")
.setMaster("local");
JavaSparkContext sc =newJavaSparkContext(conf);
SQLContext sqlContext =newSQLContext(sc);
DataFrame studentScoresDF = sqlContext.read().json("student.json");
studentScoresDF.registerTempTable("student_scores");
DataFrame goodStudentScoresDF = sqlContext.sql(
"select name,count(score) from student_scores where score>=80 group by name");
List<String> goodStudentNames = goodStudentScoresDF.javaRDD().map(newFunction<Row,String>(){
privatestaticfinallong serialVersionUID =1L;
@Override
publicString call(Row row)throwsException{
return row.getString(0);
}
}).collect();
for(String str: goodStudentNames){
System.out.println(str);
}
}
}
parquet是一个基于列的存储格式,列式存储布局可以加速查询,因为它只检查所有需要的列并对它们的值执行计算,因此只读取一个数据文件或表的小部分数据。Parquet 还支持灵活的压缩选项,因此可以显著减少磁盘上的存储。
如果在 HDFS 上拥有基于文本的数据文件或表,而且正在使用 Spark SQL 对它们执行查询,那么强烈推荐将文本数据文件转换为 Parquet 数据文件,以实现性能和存储收益。当然,转换需要时间,但查询性能的提升在某些情况下可能达到 30 倍或更高,存储的节省可高达 75%!
package com.bjsxt.java.spark.sql.createdf;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;
/**
* 使用反射的方式将RDD转换成为DataFrame
* 1、自定义的类必须是public
* 2、自定义的类必须是可序列化的
* 3、RDD转成DataFrame的时候,他会根据自定义类中的字段名进行排序。
* @author zfg
*
*/
publicclass RDD2DataFrameByReflection {
publicstaticvoid main(String[] args){
SparkConf conf =newSparkConf().setMaster("local").setAppName("RDD2DataFrameByReflection");
JavaSparkContext sc =newJavaSparkContext(conf);
SQLContext sqlcontext =newSQLContext(sc);
JavaRDD<String> lines = sc.textFile("Peoples.txt");
JavaRDD<Person> personsRdd = lines.map(newFunction<String,Person>(){
privatestaticfinallong serialVersionUID =1L;
@Override
publicPerson call(String line)throwsException{
String[] split = line.split(",");
Person p =newPerson();
p.setId(Integer.valueOf(split[0].trim()));
p.setName(split[1]);
p.setAge(Integer.valueOf(split[2].trim()));
return p;
}
});
//传入进去Person.class的时候,sqlContext是通过反射的方式创建DataFrame
//在底层通过反射的方式或得Person的所有field,结合RDD本身,就生成了DataFrame
DataFrame df = sqlcontext.createDataFrame(personsRdd,Person.class);
//命名table的名字为person
df.registerTempTable("personTable");
DataFrame resultDataFrame = sqlcontext.sql("select * from personTable where age > 7");
resultDataFrame.show();
//将df转成rdd
JavaRDD<Row> resultRDD = resultDataFrame.javaRDD();
JavaRDD<Person> result = resultRDD.map(newFunction<Row,Person>(){
privatestaticfinallong serialVersionUID =1L;
@Override
publicPerson call(Row row)throwsException{
Person p =newPerson();
p.setAge(row.getInt(0));
p.setId(row.getInt(1));
p.setName(row.getString(2));
return p;
}
});
List<Person> personList = result.collect();
for(Person person : personList){
System.out.println(person.toString());
}
}
}
package com.bjsxt.java.spark.sql.createdf;
import java.util.ArrayList;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
publicclass RDD2DataFrameByProgrammatically {
publicstaticvoid main(String[] args){
SparkConf conf =newSparkConf().setMaster("local").setAppName("RDD2DataFrameByReflection");
JavaSparkContext sc =newJavaSparkContext(conf);
SQLContext sqlcontext =newSQLContext(sc);
/**
* 在RDD的基础上创建类型为Row的RDD
*/
JavaRDD<String> lines = sc.textFile("Peoples.txt");
JavaRDD<Row> rowRDD = lines.map(newFunction<String,Row>(){
privatestaticfinallong serialVersionUID =1L;
@Override
publicRow call(String line)throwsException{
String[] split = line.split(",");
returnRowFactory.create(Integer.valueOf(split[0]),split[1],Integer.valueOf(split[2]));
}
});
/**
* 动态构造DataFrame的元数据,一般而言,有多少列以及每列的具体类型可能来自于Json,也可能来自于DB
*/
ArrayList<StructField> structFields =newArrayList<StructField>();
structFields.add(DataTypes.createStructField("id",DataTypes.IntegerType,true));
structFields.add(DataTypes.createStructField("name",DataTypes.StringType,true));
structFields.add(DataTypes.createStructField("age",DataTypes.IntegerType,true));
//构建StructType,用于最后DataFrame元数据的描述
StructType schema =DataTypes.createStructType(structFields);
/**
* 基于已有的MetaData以及RDD<Row> 来构造DataFrame
*/
DataFrame df = sqlcontext.createDataFrame(rowRDD, schema);
/**
*注册成为临时表以供后续的SQL操作查询
*/
df.registerTempTable("persons");
/**
* 进行数据的多维度分析
*/
DataFrame result = sqlcontext.sql("select * from persons where age > 7");
result.show();
/**
* 对结果进行处理,包括由DataFrame转换成为RDD<Row>
*/
List<Row> listRow = result.javaRDD().collect();
for(Row row : listRow){
System.out.println(row);
}
}
}
package com.bjsxt.java.spark.sql.jdbc;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.DataFrameReader;
import org.apache.spark.sql.SQLContext;
/**
* JDBC数据源
*
* @author Administrator
*
*/
publicclassJDBCDataSource{
publicstaticvoid main(String[] args){
SparkConf conf =newSparkConf().setAppName("JDBCDataSource").setMaster("local");
JavaSparkContext sc =newJavaSparkContext(conf);
SQLContext sqlContext =newSQLContext(sc);
// 方法1、分别将mysql中两张表的数据加载为DataFrame
/*
* Map<String, String> options = new HashMap<String, String>();
* options.put("url", "jdbc:mysql://hadoop1:3306/testdb");
* options.put("driver", "com.mysql.jdbc.Driver");
* options.put("user","spark");
* options.put("password", "spark2016");
* options.put("dbtable", "student_info");
* DataFrame studentInfosDF = sqlContext.read().format("jdbc").options(options).load();
* options.put("dbtable", "student_score");
* DataFrame studentScoresDF = sqlContext.read().format("jdbc") .options(options).load();
*/
// 方法2、分别将mysql中两张表的数据加载为DataFrame
DataFrameReader reader = sqlContext.read().format("jdbc");
reader.option("url","jdbc:mysql://node4:3306/testdb");
reader.option("driver","com.mysql.jdbc.Driver");
reader.option("user","root");
reader.option("password","123");
reader.option("dbtable","student_info");
DataFrame studentInfosDF = reader.load();
reader.option("dbtable","student_score");
DataFrame studentScoresDF = reader.load();
// 将两个DataFrame转换为JavaPairRDD,执行join操作
studentInfosDF.registerTempTable("studentInfos");
studentScoresDF.registerTempTable("studentScores");
String sql ="SELECT studentInfos.name,age,score "
+" FROM studentInfos JOIN studentScores"
+" ON (studentScores.name = studentInfos.name)"
+" WHERE studentScores.score > 80";
DataFrame sql2 = sqlContext.sql(sql);
sql2.show();
}
}
4. 如何将DataFrame中的值写入到外部存储中去?
测试结果
5.整合Spark和Hive?
scala>import org.apache.spark.sql.hive.HiveContext
scala>val hiveContext =newHiveContext(sc)
scala>hiveContext.sql("show tables").show
6.SqlContext和HiveContext的关系?
Spark_总结四的更多相关文章
- Spark_总结五
Spark_总结五 1.Storm 和 SparkStreaming区别 Storm 纯实时的流式处理,来一条数据就立即进行处理 SparkStreaming ...
- Spark_总结一
Spark_总结一 1.Spark介绍 1.1什么是Spark? Apache Spark是一个开源的集群计算框架,使数据计算更快(高效运行,快速开发) 1.2Spa ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户
阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)
前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
随机推荐
- 笔记整理——C语言-http
C语言 HTTP GZIP数据解压 - 大烧饼的实验室 - 博客园 - Google Chrome (2013/4/10 18:22:26) C语言 HTTP GZIP数据解压 这个代码在http ...
- Core Data 应用程序实践指南(Core Data 应用程序实践指南)
译者序 前言 勘误 1. 初次尝试Core Data应用程序 本书的基础,基本概念,能做什么,不能做什么.实现CoreDataHelper类,演示如何将Core Data同既有的应用程序相集成. 2. ...
- YII 1.0 发表文章用到的小物件
<?php $form = $this->beginWidget('CActiveForm',array('htmlOptions'=>array('enctype'=>'mu ...
- 详解JavaScript中的事件处理
在漫长的演变史,我们已经告别了内嵌式的事件处理方式(直接将事件处理器放在HTML元素之内来使用),今天的事件,它已是DOM的重要组成部分,遗憾的是,IE继续保留它最早在IE4.0中实现的事件模型,以后 ...
- jQuery动画高级用法(上)——详解animation中的.queue()动画队列插队函数
决定对animate方面做一些总结,希望能给大家一些启发和帮助 从一个实际应用谈起 今天不谈animate().fadeIn().fadeOut().slideUp().show().hide()诸如 ...
- jenkins用户权限配置错误,导致登录时提示:没有Overall/read权限
jenkins用户权限配置错误,导致登录时提示:没有Overall/read权限 由于初次接触jenkins,于是在搭建好jenkins以后,想要对用户进行管理,于是乎开始在系统管理->conf ...
- Pomelo的component组件
pomelo的核心是由一系列松耦合的component组成,同时我们也可以实现我们自己的component来完成一些自己定制的功能.对于我们的聊天应用,我们尝试给其增加一个component,目的是展 ...
- Condition源码分析
转:http://www.nbtarena.com/Html/soft/201308/2429.html Condition的概念 大体实现流程 I.初始化状态 II.await()*作 III.si ...
- ubuntu-16.04(linux)使用Reaver爆破wifi密码(路由器的WPS功能漏洞)
路由器的WPS功能 很多路由器都有WPS功能, 这边的WPS不是office工具软件, 而是路由器的一个功能: 路由器中WPS是由Wi-Fi联盟所推出的全新Wi-Fi安全防护设定(Wi-Fi Prot ...
- 《JAVASCRIPT高级程序设计》第五章(1)
引用类型是一种将数据和功能组合到一起的数据结构,它与类相似,但是是不同的概念:ECMAScript虽然是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和结构等基本结构.引用类型也被称为“对 ...