Spark SQL的简单使用

本文详细介绍了Spark SQL的基础用法,包括SQLContext、HiveContext、SparkSession的使用,以及如何通过spark-shell、spark-sql和thriftserver/beeline进行交互。内容涵盖了数据源的读取、Spark程序的打包部署以及各种工具的执行示例。

概述:本文主要介绍SQLContext、HiveContext、SparkSession、spark-sql、spark-shell及thriftserver/beeline的简单使用。

1、SQLContext的使用

使用SqlContext可以从多种数据源中创建DataFrame,包括json、parquet、csv(2.x)、hive、jdbc等,使用参考图示:

(1)加载依赖

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.12</artifactId>
    <version>2.4.2</version>
</dependency>

(2)编程

SparkConf->SparkContext->读取数据->关闭资源

def main(args: Array[String]): Unit = {
    val path=args(0)
    //1、创建Context
    val sparkConf=new SparkConf();
    sparkConf.setAppName("SQLContextApp").setMaster("local[2]")//设置本地模式,部署时要注释掉
    val sc=new SparkContext(sparkConf)
    val SQLContext=new SQLContext(sc)
​
    //2、业务相关处理
    val people=SQLContext.read.format("json").load(path);//处理json格式的数据
    people.printSchema()
    people.show()
    //3、关闭资源
    sc.stop()
  }

本地json数据如下:

vi app/spark-2.4.2-bin-hadoop2.6/examples/src/main/resources/people.json
​
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}

Windows下使用IDEA以local模式运行spark程序报错:

ERROR Shell: Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

(1)下载并解压https://github.com/srccodes/hadoop-common-2.2.0-bin

(2)配置环境变量

HADOOP_HOME
C:\Program Files\SoftWare\hadoop2.6

2、HiveContext的使用

(1)引入jar

<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.12</artifactId>
    <version>2.4.2</version>
    <scope>provided</scope>
</dependency>
​

(2)编程

SparkConf->SparkContext->HiveContext->读取表数据->关闭资源

def main(args: Array[String]): Unit = {
    val sparkConf=new SparkConf()
    //创建HiveContext
    val sc=new SparkContext(sparkConf);
    val hc=new HiveContext(sc);
    //读取表数据
    hc.table("emp").show
    //关闭资源
    sc.stop()
  }

3、SparkSession的使用

(1)编程

def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("SparkSessionApp").master("local[2]").getOrCreate();
    val people = spark.read.json("file:///F:/people.json")
    people.show()
    spark.stop()
  }

4、Spark程序打包部署

mvn clean package -DskipTests
​
#上传服务器
scp sql-1.0-SNAPSHOT.jar root@hadoop:~/lib
#使用脚本运行jar包
vi ~/app/spark-2.4.2-bin-hadoop2.6/sqlContext.sh
#可以先在spark路径下直接执行
cd ~/app/spark-2.4.2-bin-hadoop2.6/
#测试通过后写入脚本
./bin/spark-submit \
  --name SQLContextApp \
  --class com.inspur.spark.SQLContextApp \
  --master local[2] \
  /root/lib/sql-1.0-SNAPSHOT.jar \
  /root/app/spark-2.4.2-bin-hadoop2.6/examples/src/main/resources/people.json
​
#为sqlContext.sh添加执行权限
chmod u+x ~/app/spark-2.4.2-bin-hadoop2.6/sqlContext.sh

5、spark-shell/spark-sql和thriftserver/beeline的使用

(1)spark-shell的使用

#启动 设置运行模式、加载mysql驱动
./app/spark-2.4.2-bin-hadoop2.6/bin/spark-shell --master local[2] --jars /root/software/mysql-connector-java-5.1.47-bin.jar
#查看数据库表
spark.sql("show tables").show
#关联查询
spark.sql("select * from emp e join dept d on e.deptno=d.deptno").show

spark-shell在服务器上的执行结果如图:

(2)spark-sql的使用

#以spark-sql方式执行 该方式下可以使用HQL命令操作数据库
./app/spark-2.4.2-bin-hadoop2.6/bin/spark-sql --master local[2] --jars /root/software/mysql-connector-java-5.1.47-bin.jar
​
#创建表
create table t(key string,value string);
#查看执行计划
explain select a.key*(3+9),b.value from t a join t b on a.key=b.key and a.key>5;
​
explain extended select a.key*(3+9),b.value from t a join t b on a.key=b.key and a.key>5;

Spark架构:

(3) thriftserver/beeline

#启动thriftserver 修改默认端口
./sbin/start-thriftserver.sh \
  --hiveconf hive.server2.thrift.port=20000 \
  --master local[2] \
  --jars /root/software/mysql-connector-java-5.1.47-bin.jar
  
#启动beeline  其中 -n 后为系统用户名
​

启动: -n 后为系统用户名 端口与thriftserver一致

./bin/beeline -u jdbc:hive2://localhost:20000 -n root

(4)编程方式访问thriftserver

a、引入jar

<!-- https://mvnrepository.com/artifact/org.spark-project.hive/hive-jdbc -->
<dependency>
    <groupId>org.spark-project.hive</groupId>
    <artifactId>hive-jdbc</artifactId>
    <version>1.2.1.spark2</version>
</dependency>
​

b、编程

object SparkSQLThriftServerApp {
  def main(args: Array[String]): Unit = {
    Class.forName("org.apache.hive.jdbc.HiveDriver");
    //任意指定一个访问用户
    val conn = DriverManager.getConnection("jdbc:hive2://hadoop:10000", "myHadoop", "");
    val pstmt = conn.prepareStatement("select empno,ename,sal from emp");
    val rs = pstmt.executeQuery();
    while (rs.next()) {
      println("empno:" + rs.getInt("empno") + "\tename:" + rs.getString("ename") + "\tsal:" + rs.getString("sal"))
    }
  }
}

(5)比较

spark-shell、spark-sql都是一个spark application,thriftserver解决了数据共享问题,无论启动多少个客户端(beeline/code),都是一个spark application.

### Spark SQL 使用教程 #### 什么是Spark SQLSpark SQL 是 Apache Spark 中的一个模块,旨在处理结构化数据。它可以无缝集成到现有的 Spark 程序中,并提供了强大的 API 来查询关系型和非关系型数据库中的数据[^3]。 #### Spark SQL 的主要特性 - **统一的数据访问层**:支持多种数据源(如 Hive、Parquet、JSON),并通过 DataFrame 和 Dataset 提供一致的操作接口。 - **性能优化**:采用 Catalyst 查询优化器自动调整执行计划以提高效率。 - **标准兼容性**:完全支持 ANSI SQL 标准语句以及 JDBC/ODBC 接口[^3]。 #### 在IDEA中创建并运行一个简单Spark SQL应用实例 下面给出一段完整的Scala代码示例说明如何通过Spark SQL操作Hive表: ```scala package spark.demo.sql import org.apache.spark.sql.SparkSession object SparkSQLHiveDemo { def main(args: Array[String]): Unit = { // 创建带有hive支持功能的SparkSession对象 val spark = SparkSession.builder() .appName("Spark Hive Demo") .enableHiveSupport() // 启用对 hive 的支持 .getOrCreate() try{ // 执行DDL语句构建测试表格students spark.sql(""" CREATE TABLE IF NOT EXISTS students ( id INT, name STRING, age INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' """) // 加载外部TXT文档作为学生记录导入新建的学生列表里 spark.sql(s""" LOAD DATA LOCAL INPATH '/root/data/students.txt' INTO TABLE students """) // 展示所有录入的学生资料详情 println("Students Data:") spark.sql("SELECT * FROM students").show() } finally { spark.stop() } } } ``` 该程序首先定义了一个新的 SparkSession 实例,并启用了 Hive 支持选项 `.enableHiveSupport()` 。接着它尝试创建一张名为 `students` 的 Hive 表格,如果这张表不存在的话;随后把位于 `/root/data/students.txt` 路径下的文本文件装载进来填充这个表格内容;最后打印出整个学生的名单信息[^2]。 #### 连接其他存储系统-HBase上的Spark SQL查询 除了传统的RDBMS之外,还可以轻松地与其他NoSQL解决方案比如HBase一起协作工作。这里有一个关于如何设置从 HBase 获取数据再利用 Spark SQL 处理的例子: ```scala val spark = SparkSession.builder() .appName("SparkSQL on HBase") .config("spark.hbase.host", "your_hbase_host") .getOrCreate() // Read data from an existing HBase table. val df = spark.read.format("org.apache.hadoop.hbase.spark"). option("hbase.table","your_table_name"). option("hbase.columns.mapping", "key STRING :key," + "name STRING cf:name,"+ "age INT cf:age"). load() df.createOrReplaceTempView("people") val result = spark.sql("SELECT name, age FROM people WHERE age > 20") result.show() spark.stop() ``` 在这个例子当中,我们指定了要读取哪个具体的 HBase 表(`your_table_name`)还有各个字段之间的映射关系等等细节之后就可以像对待普通的 dataframe 那样对其进行各种各样的 sql 操作了[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值