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

  1. <dependency>
  2. <groupId>org.apache.spark</groupId>
  3. <artifactId>spark-core_2.10</artifactId>
  4. <version>1.6.0</version>
  5. <scope>provided</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.spark</groupId>
  9. <artifactId>spark-hive_2.10</artifactId>
  10. <version>1.6.0</version>
  11. <scope>provided</scope>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.apache.spark</groupId>
  15. <artifactId>spark-sql_2.10</artifactId>
  16. <version>1.6.0</version>
  17. <scope>provided</scope>
  18. </dependency>

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

  1. package com.xiaoju.dqa.fireman.driver;
  2. import com.xiaoju.dqa.fireman.exception.SparkInitException;
  3. import com.xiaoju.dqa.fireman.utils.PropertiesUtil;
  4. import org.apache.spark.SparkConf;
  5. import org.apache.spark.sql.SQLContext;
  6. import org.apache.spark.api.java.JavaSparkContext;
  7. import org.apache.spark.sql.hive.HiveContext;
  8.  
  9. import java.io.IOException;
  10. import java.util.Properties;
  11.  
  12. public class SparkClient {
  13. private SparkConf sparkConf;
  14. private JavaSparkContext javaSparkContext;
  15.  
  16. public SparkClient() {
  17. initSparkConf();
  18. javaSparkContext = new JavaSparkContext(sparkConf);
  19. }
  20.  
  21. public SQLContext getSQLContext() throws SparkInitException {
  22. return new SQLContext(javaSparkContext);
  23. }
  24.  
  25. public HiveContext getHiveContext() throws SparkInitException {
  26. return new HiveContext(javaSparkContext);
  27. }
  28.  
  29. private void initSparkConf() {
  30. try {
  31. PropertiesUtil propUtil = new PropertiesUtil("fireman.properties");
  32. Properties prop = propUtil.getProperties();
  33. String warehouseLocation = System.getProperty("user.dir");
  34. sparkConf = new SparkConf()
  35. .setAppName(prop.getProperty("spark.appname"))
  36. .set("spark.sql.warehouse.dir", warehouseLocation)
  37. .setMaster(prop.getProperty("spark.master"));
  38. } catch (IOException ex) {
  39. ex.printStackTrace();
  40. }
  41. }
  42.  
  43. }

驱动程序driver

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

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

  1. public class FiremanDriver implements Serializable {
  2. private String db;
  3. private String table;
  4. private HiveContext hiveContext;public FiremanDriver(String db, String table) {
  5. try {
  6. this.db = db;
  7. this.table = table;
  8. SparkClient sparkClient = new SparkClient();
  9. hiveContext = sparkClient.getHiveContext();
  10. } catch (SparkInitException ex) {
  11. ex.printStackTrace();
  12. }
  13. }
  14.   public void check() {
  15. HashMap<String, Object> result = null;
  16. try {
  17. String query = String.format("select * from %s.%s", db ,table);
  18. System.out.println(query);
  19. DataFrame rows = hiveContext.sql(query);
  20. JavaRDD<Row> rdd = rows.toJavaRDD();
  21. result = rdd.map(new Function<Row, HashMap<String, Object>>() {
  22. @Override
  23. public HashMap<String, Object> call(Row row) throws Exception {
  24. HashMap<String, Object> fuseResult = new HashMap<String, Object>();
  25. HashMap<String, Object> rowMap = formatRowMap(row);
  26. // 实际map过程
  27. return mapResult;
  28. }
  29. }).reduce(new Function2<HashMap<String, Object>, HashMap<String, Object>, HashMap<String, Object>>() {
  30. @Override
  31. public HashMap<String, Object> call(HashMap<String, Object> map1, HashMap<String, Object> map2) throws Exception {
  32. // reduce merge过程
                return mergeResult;
  33. }
  34. });
  35.  
  36. } catch (Exception ex) {
  37. ex.printStackTrace();
  38. }
  39. }
  40.  
  41.   // 读取shema,这里在通过spark-sql读取到row数据之后,将schema解析出来,并且映射为hashmap
  42. private HashMap<String, Object> formatRowMap(Row row){
  43. HashMap<String, Object> rowMap = new HashMap<String, Object>();
  44. try {
  45.         for (int i=0; i<row.schema().fields().length; i++) {
  46. String colName = row.schema().fields()[i].name();
  47. Object colValue = row.get(i);
  48. rowMap.put(colName, colValue);
  49. }catch (Exception ex) {
  50. ex.printStackTrace();
  51. }
  52. return rowMap;
  53. }
  54.  
  55. public static void main(String[] args) {
  56. String db = args[0];
  57. String table = args[1];
  58. FiremanDriver firemanDriver = new FiremanDriver(db, table);
  59. firemanDriver.check();
  60. }
  61. }

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. 个人作业1——四则运算题目生成程序(java代码,基于控制台)

    一.题目描述: 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: ...

  2. 个人作业3—个人总结(Alpha阶段)

    一.关于Alpha阶段的总结 1.我们团队的情况 关于我们拖拉机团队,大家在一起做项目的这几周算是比较团结.首先组长布置的任务,每个人都有认真去做,每次例会还会总结不足,提出改进,并且实施这些改进:其 ...

  3. 201521123079《java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  4. 201521123069 《Java程序设计》 第3周学习总结

    1. 本章学习总结 如果看不清楚可点击类与对象 2. 书面作业 Q1. 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private sta ...

  5. 201521123095 《Java程序设计》第3周学习总结

    ,1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面 ...

  6. 201521123029《Java程序设计》第三周学习总结

    1.本周学习总结 2.书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pu ...

  7. 201521123096《Java程序设计》第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  8. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

  9. DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week2优化算法

    1. Mini-batch梯度下降法 介绍 假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理: 如图所示,我 ...

  10. 参加Java培训你必须知道的五点真相!

    相信大家都有过到招聘网站投简历.找工作的经历.当一份份简历发出三天后,左等右等连一个电话没有等来,心中不免有些失落,有些焦虑.这个时侯,很多培训机构就会纷纷给你打电话以各种名义让你参加各种IT技能培训 ...