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 tabledf.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 > 20df.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;@OverridepublicString 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;@OverridepublicPerson 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本身,就生成了DataFrameDataFrame df = sqlcontext.createDataFrame(personsRdd,Person.class);//命名table的名字为persondf.registerTempTable("personTable");DataFrame resultDataFrame = sqlcontext.sql("select * from personTable where age > 7");resultDataFrame.show();//将df转成rddJavaRDD<Row> resultRDD = resultDataFrame.javaRDD();JavaRDD<Person> result = resultRDD.map(newFunction<Row,Person>(){privatestaticfinallong serialVersionUID =1L;@OverridepublicPerson 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;@OverridepublicRow 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中两张表的数据加载为DataFrameDataFrameReader 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.HiveContextscala>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 查询优化程序处理查询并且针对给定可利用的索引选 ...
随机推荐
- XML 字符串解析
微信红包发送完成后返回xml字符串,解析过程如下: 1.调用解析: public ActionResult GetEntityFromXml() { string str = @"<x ...
- 随机矩阵(stochastic matrix)
最近一个月来一直在看Google排序的核心算法---PageRank排序算法[1][2],在多篇论文中涉及到图论.马尔可夫链的相关性质说明与应用[3][4][5],而最为关键,一直让我迷惑 ...
- HDU-4371-Alice and Bob
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4371 这题在比赛的时候看错了题意,卡了很久都没做出来,也没有再回头仔细去看题,所以没做出来,之后再看别 ...
- 3D游戏开发之在UE4中创建非玩家角色(NPC)
接着上节我们继续学习,现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 一 创建C++类 1) 在UE编 ...
- Linux下添加shell脚本使得nginx日志每天定时切割压缩
Linux下添加shell脚本使得nginx日志每天定时切割压缩一 简介 对于nginx的日志文件,特别是access日志,如果我们不做任何处理的话,最后这个文件将会变得非常庞大 这时,无论是出现异常 ...
- android延迟执行
延迟执行可以通过以下操作实现,按照推荐的顺序列出来 1. new Handler().postDelayed(new Runnable(){ public void run() { //execut ...
- (四)Hololens Unity 开发之 凝视系统
学习源于官方文档 Gaze in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 HoloLens 有三大输入系统,凝视点.手势和声音 ~ 本文主要记录凝视 ...
- 在ubuntu linux 中编写一个自己的bash脚本
在ubuntu linux 中编写一个自己的简单的bash脚本. 实现功能:终端中输入简单的命令(以pm为例(play music)),来实现音乐的播放.注:本人ununut中安装了audacious ...
- 常用js类型相互转换
数字转换为字符串 var a=200.21;document.write(a.toString(10)); 结果为:200.21以十进制转换 document.write(a.toFixed(3)) ...
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
树 利用顺序存储和链式存储的特点,可以实现树的存储结构的表示,具体表示法有很多种. 1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置. 2)孩子表示法:把每个结点的孩子排列起来 ...