SparkSQL简单使用

本博客介绍了SparkSQL的基础知识,包括其作为结构化和半结构化数据操作接口的功能,如从JSON、Parquet等数据源读取数据,支持SQL查询以及与Spark程序的集成。此外,还详细讲解了如何创建和使用SparkSession。在进一步的实践中,展示了如何读取JSON文件,过滤数据并展示结果,以及如何定义和使用自定义聚合函数MyAverage来计算平均薪资。
摘要由CSDN通过智能技术生成

第1关:SparkSQL初识

任务描述

本关任务:编写一个sparksql基础程序。

相关知识

为了完成本关任务,你需要掌握:1. 什么是SparkSQL 2. 什么是SparkSession

什么是SparkSQL

Spark SQL是用来操作结构化和半结构化数据的接口。 当每条存储记录共用已知的字段集合,数据符合此条件时,Spark SQL就会使得针对这些数据的读取和查询变得更加简单高效。具体来说,Spark SQL提供了以下三大功能: (1) Spark SQL可以从各种结构化数据源(例如JSONParquet等)中读取数据。

(2) Spark SQL不仅支持在Spark程序内使用SQL语句进行数据查询,也支持从类似商业智能软件Tableau这样的外部工具中通过标准数据库连接器(JDBC/ODBC)连接sparkSQL进行查询。

(3) 当在Spark程序内使用Spark SQL时,Spark SQL支持SQL与常规的Python/Java/Scala代码高度整合,包括连接RDDSQL表、公开的自定义SQL函数接口等。

什么是SparkSession

Spark中所有功能的入口点都是SparkSession类。要创建基本的SparkSession,只需使用SparkSession.builder()

import org.apache.spark.sql.SparkSession;

SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL基本示例")
.master("local")
.config("spark.some.config.option" , "some-value")
.getOrCreate();
//打印spark版本号
System.out.println(spark.version());

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 打印spark的版本号。

代码实现

package com.educoder.bigData.sparksql;

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


public class Test1 {

	public static void main(String[] args) throws AnalysisException {
		/********* Begin *********/
		SparkSession  spark  =  SparkSession 
                  .builder()
                  .appName("Java Spark SQL基本示例")
                  .master("local")
                  .config("spark.some.config.option" , "some-value")
                  .getOrCreate();
 //打印spark版本号
 System.out.println(spark.version());

		/********* End *********/
	}

}

第2关:Dataset创建及使用

编程要求

根据提示,在右侧编辑器补充代码,读取people.json文件,过滤age23的数据,并以表格形式显示前20Dataset

代码实现

package com.educoder.bigData.sparksql;

import org.apache.spark.sql.AnalysisException;
import org.apache.spark.sql.SparkSession;


public class Test2 {


	public static void main(String[] args) throws AnalysisException {
		
		SparkSession  spark  =  SparkSession 
				  .builder()
				  .appName("test1")
				  .master("local")
				  .config("spark.some.config.option" , "some-value")
				  .getOrCreate();
		/********* Begin *********/
		
		//读取json,并将Dataset,并注册为SQL临时视图
        spark.read().json("people.json").createOrReplaceTempView("people");

        spark.sql("select * from people where age !='23'").show();

		/********* End *********/
	}

}

第3关:Dataset自定义函数

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,编写自定义函数类MyAverage,用来计算用户薪水平均值,平台已提供了最后的实现:

代码实现

package com.educoder.bigData.sparksql;

import java.util.ArrayList;
import java.util.List;

import org.apache.spark.sql.Row;
import org.apache.spark.sql.expressions.MutableAggregationBuffer;
import org.apache.spark.sql.expressions.UserDefinedAggregateFunction;
import org.apache.spark.sql.types.DataType;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

public class MyAverage extends UserDefinedAggregateFunction {
	
	private static final long serialVersionUID = 1L;
	
	private StructType inputSchema;
	private StructType bufferSchema;

	public MyAverage() {
		/********* Begin *********/
        List<StructField> inputFields = new ArrayList<StructField>();
        inputFields.add(DataTypes.createStructField("inputColumn", DataTypes.       LongType, true));
        inputSchema = DataTypes.createStructType(inputFields);
        List<StructField> bufferFields = new ArrayList<StructField>();
        bufferFields.add(DataTypes.createStructField("sum", DataTypes.LongType, true));
        bufferFields.add(DataTypes.createStructField("count", DataTypes.LongType, true));
        bufferSchema = DataTypes.createStructType(bufferFields);
		/********* End *********/
	  }
	
	@Override
	public StructType bufferSchema() {
		/********* Begin *********/
		
		//return null;
		return bufferSchema;
		/********* End *********/
	}

	@Override
	public DataType dataType() {
		/********* Begin *********/
		
		//return null;
		return DataTypes.DoubleType;
		/********* End *********/
	}

	@Override
	public boolean deterministic() {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	public Object evaluate(Row buffer) {
		/********* Begin *********/
		
		//return null;
		return ((double) buffer.getLong(0)) / buffer.getLong(1);
		/********* End *********/
	}

	@Override
	public void initialize(MutableAggregationBuffer buffer) {
		/********* Begin *********/
		buffer.update(0, 0L);
        buffer.update(1, 0L);
		
		/********* End *********/	

	}

	@Override
	public StructType inputSchema() {
		/********* Begin *********/
		
		//return null;
		return inputSchema;
		/********* End *********/
	}

	@Override
	public void merge(MutableAggregationBuffer buffer1, Row buffer2) {
		/********* Begin *********/
		long mergedSum = buffer1.getLong(0) + buffer2.getLong(0);
        long mergedCount = buffer1.getLong(1) + buffer2.getLong(1);
        buffer1.update(0, mergedSum);
        buffer1.update(1, mergedCount);

		
		
		/********* End *********/
	}

	@Override
	public void update(MutableAggregationBuffer buffer, Row input) {
		/********* Begin *********/
		if (!input.isNullAt(0)) {
        long updatedSum = buffer.getLong(0) + input.getLong(0);
        long updatedCount = buffer.getLong(1) + 1;
        buffer.update(0, updatedSum);
        buffer.update(1, updatedCount);
        }
		
		
		/********* End *********/

	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值