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数据的更多相关文章

  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 ...

  10. Spark之SQL解析(源码阅读十)

    如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么.之前总结的已经写了传统数据库与Spark的sql解析之间的差别.那么我们下来直切主题~ 如今的Spark已经支持多 ...

随机推荐

  1. HTTP.SYS远程执行代码漏洞分析 (MS15-034 )

    写在前言:   在2015年4月安全补丁日,微软发布了11项安全更新,共修复了包括Microsoft Windows.Internet Explorer.Office..NET Framework.S ...

  2. ******十三 ******、软设笔记【操作系统】-磁盘管理、虚设备与SPOOLing系统

    五.磁盘管理 1.磁盘的访问时间 *寻道时间Ts:把磁臂从当前位置移到指定磁道上所经历的时间 *选择延迟时间Tr:指定扇区移动到磁头下面所经历的时间. *传输时间Tt:数据从磁盘读出或向磁盘写入数据所 ...

  3. GCC编译器原理(三)------编译原理三:编译过程(3)---编译之汇编以及静态链接【2】

    4.1.2 符号解析与重定位 (1)重定位 在完成空间和地址的分配步骤之后,链接器就进入了符号解析和重定位的步骤,这是静态链接的核心部分. 先看看 a.o 的反汇编文件: objdump -d a.o ...

  4. dp题2

    1.seq 给出数组 A,则 l 到 r 的一段序列可以选择以下两种得分方式之一进行得分:1.得到

  5. 【小玩意】time-passing-by clock

    就着youtube上的教程用html和js做了个小时钟. Code: clock.html //clock.html <!DOCTYPE html> <html> <he ...

  6. Coursera, Deep Learning 2, Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization - week1, Course

    Train/Dev/Test set Bias/Variance Regularization  有下面一些regularization的方法. L2 regularation drop out da ...

  7. struts2简单入门-Action的三种配置方式

    普通的配置方式 优点:可读性高 缺点:重复的配置太多. 使用情况 一个actian只有一个方法,只需要处理一种请求. 代码演示 <action name="voteResult&quo ...

  8. 【译】第八篇 SQL Server安全数据加密

    本篇文章是SQL Server安全系列的第八篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...

  9. chrome调试技巧和插件介绍

    14 个你可能不知道的 JavaScript 调试技巧 五种前端开发必备的调试技术 日志的艺术 吐血推荐珍藏的Chrome插件 吐血推荐珍藏的 Chrome 插件(二)

  10. linux 扩展根分区

    参考链接:  http://blog.51cto.com/lubcdc/1763133