当前位置: 首页 > news >正文

spark简介和核心编程

简介

1. Spark-SQL概述:Spark SQL是Spark处理结构化数据的模块,前身是Shark。Shark基于Hive开发,提升了SQL-on-Hadoop的性能,但对Hive的过度依赖制约了Spark发展。SparkSQL抛弃Shark代码,汲取其优点后重新开发,在数据兼容、性能优化、组件扩展上优势明显。Shark停止开发后,衍生出SparkSQL和Hive on Spark。SparkSQL简化RDD开发,提供DataFrame和DataSet两个编程抽象 。

2. Spark-SQL特点:一是易整合,能无缝融合SQL查询与Spark编程;二是统一数据访问,以相同方式连接不同数据源;三是兼容Hive,可在已有Hive仓库运行SQL或HQL;四是支持标准数据连接,借助JDBC或ODBC连接 。

3. DataFrame解析:DataFrame是基于RDD的分布式数据集,类似二维表格,带有schema元信息,每列有名称和类型。这使Spark SQL能优化数据源和变换操作,性能优于RDD。其API提供高层关系操作,支持嵌套数据类型,查询计划由Spark catalyst optimiser优化,执行效率高 。

4. DataSet解析:DataSet是分布式数据集合,是DataFrame的扩展。它具备RDD的强类型和lambda函数能力,以及Spark SQL优化执行引擎的优势。使用样例类定义数据结构,具有类型安全检查和查询优化特性,DataFrame是DataSet的特例(DataFrame=DataSet[Row]),二者可相互转换 。

核心编程

1. Spark SQL上下文环境:Spark SQL是对Spark Core的封装,其上下文环境对象也经过封装。早期版本有SQLContext和HiveContext两种查询起始点,分别用于Spark自身SQL查询和连接Hive查询。而SparkSession是最新的查询起始点,它整合了SQLContext和HiveContext的功能,内部封装了SparkContext,在spark - shell中会自动创建名为spark的SparkSession对象。

2. DataFrame创建:SparkSession是创建DataFrame和执行SQL的入口,创建方式有三种,包括从Spark数据源创建,例如读取spark的bin/data目录下的user.json文件来创建DataFrame;从现有RDD转换;从Hive Table查询返回。同时要注意从文件读取数字时数据类型的处理,默认用bigint接收。

3. 基于SQL语法的DataFrame操作:使用SQL语法查询DataFrame时,需要临时视图或全局视图辅助。以读取user.json文件创建DataFrame为例,先创建DataFrame,接着为其创建临时表,然后通过SQL语句查询全表并展示结果。创建全局表时,首次运行可能因缺少配置报错,需将hive - site.xml文件复制到spark的conf路径下,配置完成后创建全局表并进行查询展示

4. DataFrame的DSL语法:DataFrame提供DSL用于管理结构化数据,支持在多种语言中使用,且无需创建临时视图。操作包括创建DataFrame,查看Schema信息,如通过 printSchema 方法;选择特定列数据,如 select("username") ;进行列运算,运算时列需用 $ 或引号表达式;数据过滤,依据条件筛选数据;按列分组统计数据条数 。

5. RDD转换为DataFrame:在IDEA开发时,RDD与DF或DS互操作需导入 import spark.implicits._ ,且 spark 是SparkSession对象变量名,需先创建该对象,且只能用 val 修饰。在spark-shell中无需手动导入。RDD可直接调用 toDF 方法转换,实际开发常借助样例类实现 。

6. DataFrame转换为RDD:DataFrame是对RDD的封装,可直接获取内部RDD。获取后RDD存储类型为 Row ,通过 collect 方法收集数据,可使用 getAs 方法按列名获取具体值 

7.DataSet操作:DataSet具有强类型特性,创建方式多样。可使用样例类序列,如定义 Person 样例类后,通过 Seq(Person("zhangsan",2)).toDS() 创建;也能用基本类型序列创建,但实际中更多从RDD转换得到。RDD可自动转换为DataSet,借助样例类定义结构,属性反射成列名。DataSet可直接获取内部RDD 。

8. DataFrame与DataSet转换:DataFrame是DataSet的特例,二者可相互转换。DataFrame转DataSet需借助样例类,使用 as 方法;DataSet转DataFrame则调用 toDF 方法 。

9. RDD、DataFrame、DataSet关系:从版本演进看,RDD在Spark1.0出现,DataFrame于Spark1.3诞生,Dataset在Spark1.6引入。三者均为分布式弹性数据集,有惰性机制、共同函数,会自动缓存运算,都有分区概念,DataFrame和DataSet还能模式匹配获取字段信息。不过,RDD常与spark mllib配合,不支持sparksql操作;DataFrame每行类型为Row,访问列值需解析,支持SparkSQL操作与便捷保存方式;DataSet是DataFrame扩展,强类型且自定义样例类后可自由获取行信息 。

相关文章:

  • spark-sql核心
  • 试一下阿里云新出的mcp服务
  • 鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解
  • 【字节跳动AI论文】Seaweed-7B:视频生成基础模型的高成本效益培训
  • 栈与队列习题分享(精写)
  • chrome无法访问此网站怎么回事 分享5种解决方法
  • 模拟集成电路设计与仿真 : PLL
  • CentOS DVD完整版与Minimal版的区别
  • 筛选条件在on和where中的区别(基于hivesql)
  • 数据结构·树
  • Upwork全球化战略:用“文化套利”收割国际客户
  • Spark-SQL核心编程
  • 无人机气动-结构耦合技术要点与难点
  • API:科技赋能,引领智能文字识别、身份认证与发票查验真伪变革
  • centos yum install environment-modules
  • 初识Redis · list和hash类型
  • 速卖通商品详情API接口:功能、应用与开发指南
  • 一文了解:北斗短报文终端是什么,有哪些应用场景?
  • UE 使用事件分发器设计程序
  • 深入 Java 正则表达式源码:透视 Matcher.group(int) 的分组提取机制
  • 最高降价三成,苹果中国iPhone开启大促销,能拉动多少销量?
  • “饿了么”枣庄一站点两名连襟骑手先后猝死,软件显示生前3天每日工作超11小时
  • 5月12日-14日,上海小升初民办初中进行网上报名
  • 中国科学院院士徐春明不再担任山东石油化工学院校长
  • 75万采购防火墙实为299元路由器?重庆三峡学院发布终止公告:出现违法违规行为
  • 重温经典|开播20周年,仙剑的那些幕后你知道吗?