1、spark是什么?

Spark是基于内存计算的大数据并行计算框架。

1.1 Spark基于内存计算

相比于MapReduce基于IO计算,提高了在大数据环境下数据处理的实时性。

1.2 高容错性和高可伸缩性

与mapreduce框架相同,允许用户将Spark部署在大量廉价硬件之上,形成集群。

2、spark编程

每一个spark应用程序都包含一个驱动程序(driver program ),他会运行用户的main函数,并在集群上执行各种并行操作(parallel operations)

spark提供的最主要的抽象概念有两种: 
弹性分布式数据集(resilient distributed dataset)简称RDD ,他是一个元素集合,被分区地分布到集群的不同节点上,可以被并行操作,RDDS可以从hdfs(或者任意其他的支持Hadoop的文件系统)上的一个文件开始创建,或者通过转换驱动程序中已经存在的Scala集合得到,用户也可以让spark将一个RDD持久化到内存中,使其能再并行操作中被有效地重复使用,最后RDD能自动从节点故障中恢复

spark的第二个抽象概念是共享变量(shared variables),它可以在并行操作中使用,在默认情况下,当spark将一个函数以任务集的形式在不同的节点上并行运行时,会将该函数所使用的每个变量拷贝传递给每一个任务中,有时候,一个变量需要在任务之间,或者驱动程序之间进行共享,spark支持两种共享变量: 
广播变量(broadcast variables),它可以在所有节点的内存中缓存一个值。 
累加器(accumulators):只能用于做加法的变量,例如计算器或求和器

3、spark-sql

spark-sql是将hive sql跑在spark引擎上的一种方式,提供了基于schema处理数据的方式。

4、代码详解

java spark和spark-sql依赖。

pom.xml

<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.10</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.10</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>

基于spark1.6创建HiveContext客户端。在spark2.1已经开始使用sparksession了。请注意。

package com.xiaoju.dqa.fireman.driver;
import com.xiaoju.dqa.fireman.exception.SparkInitException;
import com.xiaoju.dqa.fireman.utils.PropertiesUtil;
import org.apache.spark.SparkConf;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.hive.HiveContext; import java.io.IOException;
import java.util.Properties; public class SparkClient {
private SparkConf sparkConf;
private JavaSparkContext javaSparkContext; public SparkClient() {
initSparkConf();
javaSparkContext = new JavaSparkContext(sparkConf);
} public SQLContext getSQLContext() throws SparkInitException {
return new SQLContext(javaSparkContext);
} public HiveContext getHiveContext() throws SparkInitException {
return new HiveContext(javaSparkContext);
} private void initSparkConf() {
try {
PropertiesUtil propUtil = new PropertiesUtil("fireman.properties");
Properties prop = propUtil.getProperties();
String warehouseLocation = System.getProperty("user.dir");
sparkConf = new SparkConf()
.setAppName(prop.getProperty("spark.appname"))
.set("spark.sql.warehouse.dir", warehouseLocation)
.setMaster(prop.getProperty("spark.master"));
} catch (IOException ex) {
ex.printStackTrace();
}
} }

驱动程序driver

1、这里要实现可序列化接口,否则spark并不会识别这个类。

2、这里在通过spark-sql读取到row数据之后,将schema解析出来,并且映射为hashmap。

public class FiremanDriver implements Serializable {
private String db;
private String table;
private HiveContext hiveContext;public FiremanDriver(String db, String table) {
try {
this.db = db;
this.table = table;
SparkClient sparkClient = new SparkClient();
hiveContext = sparkClient.getHiveContext();
} catch (SparkInitException ex) {
ex.printStackTrace();
}
}
  public void check() {
HashMap<String, Object> result = null;
try {
String query = String.format("select * from %s.%s", db ,table);
System.out.println(query);
DataFrame rows = hiveContext.sql(query);
JavaRDD<Row> rdd = rows.toJavaRDD();
result = rdd.map(new Function<Row, HashMap<String, Object>>() {
@Override
public HashMap<String, Object> call(Row row) throws Exception {
HashMap<String, Object> fuseResult = new HashMap<String, Object>();
HashMap<String, Object> rowMap = formatRowMap(row);
// 实际map过程
return mapResult;
}
}).reduce(new Function2<HashMap<String, Object>, HashMap<String, Object>, HashMap<String, Object>>() {
@Override
public HashMap<String, Object> call(HashMap<String, Object> map1, HashMap<String, Object> map2) throws Exception {
// reduce merge过程
            return mergeResult;
}
}); } catch (Exception ex) {
ex.printStackTrace();
}
}   // 读取shema,这里在通过spark-sql读取到row数据之后,将schema解析出来,并且映射为hashmap
private HashMap<String, Object> formatRowMap(Row row){
HashMap<String, Object> rowMap = new HashMap<String, Object>();
try {
        for (int i=0; i<row.schema().fields().length; i++) {
String colName = row.schema().fields()[i].name();
Object colValue = row.get(i);
rowMap.put(colName, colValue);
}catch (Exception ex) {
ex.printStackTrace();
}
return rowMap;
} public static void main(String[] args) {
String db = args[0];
String table = args[1];
FiremanDriver firemanDriver = new FiremanDriver(db, table);
firemanDriver.check();
}
}

java使用spark/spark-sql处理schema数据(spark1.6)的更多相关文章

  1. Spark(Hive) SQL数据类型使用详解(Python)

    Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spar ...

  2. 毕设三: spark与phoenix集成插入数据/解析json数组

    需求:将前些日子采集的评论存储到hbase中 思路: 先用fastjson解析评论,然后构造rdd,最后使用spark与phoenix交互,把数据存储到hbase中 部分数据: [ { "r ...

  3. Spark(Hive) SQL中UDF的使用(Python)

    相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...

  4. Spark(Hive) SQL中UDF的使用(Python)【转】

    相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...

  5. 使用spark将内存中的数据写入到hive表中

    使用spark将内存中的数据写入到hive表中 hive-site.xml <?xml version="1.0" encoding="UTF-8" st ...

  6. 量化派基于Hadoop、Spark、Storm的大数据风控架构--转

    原文地址:http://www.csdn.net/article/2015-10-06/2825849 量化派是一家金融大数据公司,为金融机构提供数据服务和技术支持,也通过旗下产品“信用钱包”帮助个人 ...

  7. 【Spark】使用java语言开发spark程序

    目录 步骤 一.创建maven工程,导入jar包 二.开发代码 步骤 一.创建maven工程,导入jar包 <properties> <scala.version>2.11.8 ...

  8. WSL2+Ubuntu配置Java Maven Hadoop Spark环境

    所需文件: 更新日期为2021/5/8: Linux 内核更新包 JDK1.8 maven3.8.1 hadoop3.3.0 spark3.1.1 WSL?WSL2? WSL是适用于 Linux 的 ...

  9. (七)Transformation和action详解-Java&Python版Spark

    Transformation和action详解 视频教程: 1.优酷 2.YouTube 什么是算子 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作. 算子分类: 具体: 1.Value ...

随机推荐

  1. JTemplates 的使用

    注意事项:一定要放在Jquery的页面加载完成事件内  : $(function{}); <script src="~/Js/jquery-2.1.0.js">< ...

  2. JMeter打开脚本失败 如何解决?

    最近有碰到JMeter打开之前的脚本,报错了,见下图: 后来发现这是因为之前保存脚本的 jmeter 和这次打开脚本的 jmeter 版本不一致(图一)或者版本一致而插件没有保持同步(图二)的原因: ...

  3. MySQL索引实战经验总结

    MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源,本篇总结了一些MySQL索引实战经验. 索引是用于快速查找记录的一种数据结构.索引就像是数据库中 ...

  4. 第二次项目冲刺(Beta阶段)--第五天

    一.站立式会议照片 二.项目燃尽图 三.项目进展 - 今天任务是改进程序使程序能完成docx文件的读取,但是并没有成功实现解决该问题,所以燃尽图没有前进. -遇到的问题:不支持docx最早认为是jar ...

  5. 201521123012 《Java程序设计》第一周学习总结

    一.本章学习内容 1.了解了JDK.JRE .JVM. 2.大概看过了Java的诞生.版本演进(JDK1.1.4,JDK1.1.5--JDK1.1.8,J2SE1.2--Java SE 8)以及三大平 ...

  6. 如何将ubuntu文件夹中文名改为英文

    其实我已经忍了很久. ubuntu在中文界面下面,自动创建了"桌面","文档",图片 .公共的 .下载. 音乐. 视频等中文目录. 在命令行下操作的时候,要么切 ...

  7. Markdow使用的简单介绍

    一个例子: 例子开始 1. 本章学习总结 (字体较大,用法:#你要放大的标题) 今天主要学习了三个知识点 封装 继承 多态 用法: - 封装 - 继承 - 多态 2. 书面作业 Q1. java He ...

  8. 201521123092, 《java程序设计》第1周学习总结。

    #1.本周学习总结 这一周是我学习java的第一周,刚接触一门全新的编程语言,觉得还是有点困难的,很多基础性的java知识需要一点点学习,我会请教同学以及查询网上的学习资料,认真学好这一门学科. 本周 ...

  9. 深入浅出数据结构C语言版(17)——希尔排序

    在上一篇博文中我们提到:要令排序算法的时间复杂度低于O(n2),必须令算法执行"远距离的元素交换",使得平均每次交换减少不止1逆序数. 而希尔排序就是"简单地" ...

  10. spring 注解方式配置Bean

    Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件特定组件包括: @Component:基本注解,标示了一个受Spring管理的Bean组件 @Respository:标识 ...