SparkSql使用入门

Spark SQL的使用 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用。它是将HiveSQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduc的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢。所以Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快! 阅读详情

Spark SQL是spark套件中一个模板,它将数据的计算任务通过SQL的形式转换成了RDD的计算,类似于Hive通过SQL的形式将数据的计算任务转换成了MapReduce。

Spark SQL的特点:
1、和Spark Core的无缝集成,可以在写整个RDD应用的时候,配置Spark SQL来完成逻辑实现。
2、统一的数据访问方式,Spark SQL提供标准化的SQL查询。
3、Hive的继承,Spark SQL通过内嵌的hive或者连接外部已经部署好的hive案例,实现了对hive语法的继承和操作。
4、标准化的连接方式,Spark SQL可以通过启动thrift Server来支持JDBC、ODBC的访问,将自己作为一个BI Server使用

Spark SQL数据抽象:
1、RDD(Spark1.0)->DataFrame(Spark1.3)->DataSet(Spark1.6)
2、Spark SQL提供了DataFrame和DataSet的数据抽象
3、DataFrame就是RDD+Schema,可以认为是一张二维表格,劣势在于编译器不进行表格中的字段的类型检查,在运行期进行检查
4、DataSet是Spark最新的数据抽象,Spark的发展会逐步将DataSet作为主要的数据抽象,弱化RDD和DataFrame.DataSet包含了DataFrame所有的优化机制。除此之外提供了以样例类为Schema模型的强类型
5、DataFrame=DataSet[Row]
6、DataFrame和DataSet都有可控的内存管理机制,所有数据都保存在非堆上,都使用了catalyst进行SQL的优化。

Spark SQL客户端查询:
1、可以通过Spark-shell来操作Spark SQL,spark作为SparkSession的变量名,sc作为SparkContext的变量名
2、可以通过Spark提供的方法读取json文件,将json文件转换成DataFrame
3、可以通过DataFrame提供的API来操作DataFrame里面的数据。
4、可以通过将DataFrame注册成为一个临时表的方式,来通过Spark.sql方法运行标准的SQL语句来查询。

日常开发中可根据需要选择hive或者sparksql,本人更偏向使用sparksql代码写起来比hive要简单许多,先上一段代码

package com.debug;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class SparkSql01 {

	public static void main(String[] args) {
		SparkSession spark = SparkSession.builder().appName("json文件读取1").master("local").getOrCreate();
		//Dataset<Row> row=spark.read().json("./data/json");
		Dataset<Row> row=spark.read().format("json").load("./data/json");
		row.printSchema();
	
		
		row.createOrReplaceTempView("t1");
		Dataset<Row> row1=spark.sql("select name,age from t1");
		//Dataset转成RDD
		JavaRDD<Row> rdd=row1.javaRDD();
		
		rdd.foreach(new VoidFunction<Row>() {

			public void call(Row r) throws Exception {
				String name=r.getAs("name").toString();
				//Long age=r.getLong(r.fieldIndex("age"));
				long age=r.getAs("age")!=null?r.getAs("age"):0;
				System.out.println(name+","+age);
				
			}
		});
		
		spark.stop();
	}

}

sparksql执行后返回Row类型的DataSet, spark2.X之后官方建议使用DataSet因为DataSet在RDD的基础上做了很多优化,使用起来也和RDD大同小异,来看下对应的json文件

{"name":"zhangsan","age":20}
{"name":"lisi"}
{"name":"wangwu","age":18}
{"name":"wangwu","age":18}

执行结果如下

 

 sparksql除了可以读取普通json格式外还可以读取嵌套的json或者嵌套的JsonArray,先上一个读取单层嵌套的例子,数据如下

{"name":"王大锤","address":{"city":"昆明","detailAddress":"五华区拓东路"}}
{"name":"黄小明","address":{"city":"上海","detailAddress":"浦东新区川沙路"}}
{"name":"蔡依林","address":{"city":"北京","detailAddress":"东城区"}}
{"name":"周杰伦","address":{"city":"杭州","detailAddress":"萧山区"}}
{"name":"李现","address":{"city":"广州","detailAddress":"白云区xxx路"}}

这种情况下要取得city和detailAddress在sql的表现形式就是address.city和address.detailAddress

package com.debug;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class ReadJson01 {

	public static void main(String[] args) {
		SparkSession spark = SparkSession.builder().appName("读取嵌套json").master("local").getOrCreate();
		Dataset<Row> row=spark.read().format("json").load("./data/userInfo.txt");
		
		//row.printSchema();
		//row.show();
		
		row.createOrReplaceTempView("t1");
		Dataset<Row> row1=spark.sql("select name,address.city,address.detailAddress from t1 order by name desc");
		row1.show();
		
		
		
		spark.stop();
	}

}

运行结果如下:

接着就是嵌套的为json数组的情况,数据如下:

{"name":"王大锤","myScore":[{"score1":89,"score2":91},{"score1":78,"score2":81}]}
{"name":"黄小明","myScore":[{"score1":75,"score2":90},{"score1":63,"score2":55}]}

这种情况相对来说要复杂一些,我们需要把name和myScore使用toDF转换成DataFrame,myScore为数组不能直接转换,需要使用explode先解析

package com.debug;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;



public class ReadJson02 {

	public static void main(String[] args) {
		SparkSession spark = SparkSession.builder().appName("嵌套json数组").master("local").getOrCreate();
		Dataset<Row> ds=spark.read().format("json").load("./data/userList.txt");
		
		Dataset<Row> res=ds.select(ds.col("name"),functions.explode(ds.col("myScore"))).toDF("name","score");

		res.printSchema();
		
		res.createOrReplaceTempView("t1");
		//Dataset<Row> row1=spark.sql("select name,score.score1,score.score2 from t1 order by name desc");
		Dataset<Row> row1=spark.sql("select name,avg(score.score1) avgS1,avg(score.score2) avgS2 from t1 group by name");
		row1.show();
		
		spark.stop();
	}

}

下面是运行效果图:

PySpark | SparkSQL入门 | DataFrame入门 SparkSQL中的DataFrame的入门和操作 阅读详情

相关推荐

SparkSQL简单入门指南

通过SparkSQL,开发人员可以使用SQL查询、DataFrame API和DataSet API来处理分布式数据集。本文将为您提供一个简单的SparkSQL入门指南,介绍如何在Educoder平台上使用SparkSQL进行数据处理和分析。本文介绍了SparkSQL的简单使用方法,包括创建SparkSession、读取数据、执行SQL查询、使用DataFrame API和保存结果。SparkSQL支持从多种数据源读取数据,包括CSV文件、JSON文件、数据库表等。五、DataFrame API。

CyberJolt的博客 284

初学spark基本操作SparkSession、Dataset<Row>

RDD的具体描述RDD(弹性分布式数据集)是Spark提供的最重要的抽象的概念,它是一种有容错机制的特殊集合,可以分布在集群的节点上,以函数式编操作集合的方式,进行各种并行操作。可以将RDD理解为一个具有容错机制的特殊集合,它提供了一种只读、只能有已存在的RDD变换而来的共享内存,然后将所有数据都加载到内存中,方便进行多次重用。a.他是分布式的,可以分布在多台机器上,进行计算。 b.他是弹性的,计...

fearlessnesszhang的博客 1万+

CS1237卡尔曼滤波实战:如何用24位ADC实现电子秤级精度?

本文详细介绍了如何利用CS1237 24位ADC芯片结合卡尔曼滤波算法实现电子秤级精度测量。通过解析CS1237硬件特性、卡尔曼滤波原理及STM32驱动优化,提供了一套完整的解决方案,包括多通道支持、驱动代码实现和性能调优技巧,适用于工业测量和嵌入式开发领域。

linux的博客 1087

大数据技术之SparkSQL(超级详细)

第1章 Spark SQL概述 1.1什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用。 它是将Hive SQL转换成MapRedu

wlove514的博客 1万+

速腾聚创激光雷达复现FAST-LIO

记录复现FAST-LIO算法的过程和,代码梳理和理解。FAST-LIO的简化版、注释版。速腾激光雷达

abanchao的博客 2930

拆解汽车T-Box:从4G模块到MCU,手把手教你理解车联网的‘黑匣子’

本文深入拆解汽车T-Box,揭示其作为车联网‘黑匣子’的核心架构与工作原理。从4G模块、MCU主控到外设接口,详细解析各组件功能及协同机制,并通过实战案例展示故障诊断与性能优化技巧,帮助读者全面理解T-Box在智能汽车中的关键作用。

weixin_30955617的博客 494

SparkSQL

大数据自学笔记——spark学习笔记

我的笔记 1万+

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1975

spark第四章:SparkSQL基本操作

接下来我们学习SparkSQL他和Hql有些相似。Hql是将操作装换成MR,SparkSQL也是,不过是使用Spark引擎来操作,效率更高一些SparkSQL的常用操作基本就这些,至于项目吗,下次专门在写一次吧。

weixin_50835854的博客 2137

数据结构与算法——7-2 一元多项式的乘法与加法运算 (20分)

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例: 15 24 -25 22 30 21 -10 2

qazwsxxxxxasd的博客 1484

脉冲变压器电感选型参数,结构原理,工艺与注意问题总结

脉冲变压器电感简称脉冲变压器,是一种特殊类型的变压器,主要用于处理脉冲信号。它的主要特性是能够在短时间内承受高电压和大电流。脉冲变压器主要用于开关电源、脉冲功率放大、雷达脉冲调制等领域。本文对脉冲变压器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1344

SparkSQL入门

SparkSQL是什么、SparkSQL 的适用场景、结构化、非结构化、半结构化数据的区别、程序入口SparkSession、DataFrame和Dataset、入门程序案例(直接执行 SQL)

weixin_52134189的博客 1140

使用 Pfam 和 InterProScan 进行蛋白质家族和功能域的分析

本文介绍了使用Pfam和InterProScan进行蛋白质家族与功能域分析的方法。主要内容包括:1) Pfam数据库的本地化使用,通过hmmscan工具比对Pfam-A.hmm数据库,并提供了批量处理Python脚本;2) InterProScan的安装配置与命令行参数详解,支持多数据库整合分析;3) 补充介绍了基于curl的Uniprot在线查询方法。文章提供了从软件安装到实战分析的完整流程,适用于本地化、批量化蛋白质功能注释需求,特别是无网络环境或大规模数据分析场景,适合不同水平的生物信息学用户。

Protein Designer的博客 1918

sparkSQL1.1入门之六:sparkSQL之基础应用

sparkSQL1.1入门之六:sparkSQL之基础应用

oe516wu的专栏 507

YOLOv11架构革新:华为VanillaNet与BiFPN深度融合的突破性改进实战指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

LXY_LOVE36的博客 136

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SparkSQL的入门实践教程

摘要:Spark SQL是用于处理结构化数据的模块。与Spark RDD不同的是,Spark SQL提供数据的结构信息(源数据)和性能更好,可以通过SQL和DataSet API与Spark SQL进行交互。

华为云官方博客 2323

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

sparkSQL1.1入门之三:sparkSQL组件之解析

sparkSQL1.1入门之三:sparkSQL组件之解析

oe516wu的专栏 405

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

sparkSQL1.1入门之九:sparkSQL之调优

sparkSQL1.1入门之九:sparkSQL之调优

oe516wu的专栏 570

sparkSQL1.1入门之二:sparkSQL运行架构

sparkSQL1.1入门之二:sparkSQL运行架构

oe516wu的专栏 476

SparkSQL简介及入门

为什么80%的码农都做不了架构师?>>>    ...

s297485987的专栏 331

sparkSQL1.1入门之一:为什么sparkSQL

sparkSQL1.1入门之一:为什么sparkSQL

oe516wu的专栏 391

sparkSQL1.1入门之八:sparkSQL之综合应用

sparkSQL1.1入门之八:sparkSQL之综合应用

oe516wu的专栏 422

SparkSQL入门指南:从基础到实践的全面解析

SparkSQL为结构化数据处理提供了强大而灵活的工具,通过DataFrame、Dataset和SQL接口,开发者可以轻松处理各种数据源。本文介绍了SparkSQL的基本概念、核心功能和实际应用,包括DataFrame操作、SQL查询、连接外部数据源、UDF和性能优化等方面。SparkSession是Spark 2.0引入的新入口点,它整合了SparkContext、SQLContext和HiveContext的功能,提供了统一的API接口。创建DataFrame是使用SparkSQL的第一步。

2402_83590031的博客 2167

sparkSQL1.1入门之十:总结

sparkSQL1.1入门之十:总结

oe516wu的专栏 348

sparSQL1.1入门之六:sparkSQL之基础

SparkSQL引入了一种新的RDD——SchemaRDD,SchemaRDD由行对象(row)以及描述行对象中每列数据类型的schema组成;SchemaRDD很象传统数据库中的表。SchemaRDD可以通过RDD、Parquet文件、JSON文件、或者通过使用hiveql查询hive数据来建立。SchemaRDD除了可以和RDD一样操作外,还可以通过registerTempTable注册成临时

linyu5526627的专栏 774

SparkSQL入门案例

一、将JSON格式的数据转化为table 1、SparkSQL的数据源 SparkSQL的数据源可以是JSON类型的字符串,JDBC,Parquent,Hive,HDFS等。 {"name":"zhangsan","age":20} {"name":"lisi"} {"name":"wangwu","age":18} {"name":"wangwu","age":18} 2、依赖jar包...

weixin_43698185的博客 575
上一篇: spark算子知识整理2
下一篇: SparkSql读取csv实现统计功能
青蛙小王子
博客等级 码龄16年 239粉丝 311原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值