Spark SQL操作Hive数据库

7 篇文章 0 订阅
7 篇文章 0 订阅
本次例子通过scala编程实现Spark SQL操作Hive数据库!
Hadoop集群搭建:[url]http://kevin12.iteye.com/blog/2273532[/url]
Spark集群搭建:[url]http://kevin12.iteye.com/blog/2273532[/url]

[b]数据准备[/b]
在/usr/local/sparkApps/SparkSQL2Hive/resources/目录下创建people.txt内容如下,name和age之间是"\t"分割
Michael 20
Andy 17
Justin 19
创建份数peopleScores.txt,内容如下,name和score之间用“\t”分割
Michael 98
Andy 95
Justin 68

[b]代码实现[/b]
package com.imf.spark.sql

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.hive.HiveContext
/**
* 通过spark sql操作hive数据源
*/
object SparkSQL2Hive {

def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setAppName("SparkSQL2Hive for scala")
conf.setMaster("spark://master1:7077")

val sc = new SparkContext(conf)
val hiveContext = new HiveContext(sc)
//用户年龄
hiveContext.sql("use testdb")
hiveContext.sql("DROP TABLE IF EXISTS people")
hiveContext.sql("CREATE TABLE IF NOT EXISTS people(name STRING, age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n'")
//把本地数据加载到hive中(实际上发生了数据拷贝),也可以直接使用HDFS中的数据
hiveContext.sql("LOAD DATA LOCAL INPATH '/usr/local/sparkApps/SparkSQL2Hive/resources/people.txt' INTO TABLE people")
//用户份数
hiveContext.sql("use testdb")
hiveContext.sql("DROP TABLE IF EXISTS peopleScores")
hiveContext.sql("CREATE TABLE IF NOT EXISTS peopleScores(name STRING, score INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n'")
hiveContext.sql("LOAD DATA LOCAL INPATH '/usr/local/sparkApps/SparkSQL2Hive/resources/peopleScore.txt' INTO TABLE peopleScores")

/**
* 通过HiveContext使用join直接基于hive中的两种表进行操作
*/
val resultDF = hiveContext.sql("select pi.name,pi.age,ps.score "
+" from people pi join peopleScores ps on pi.name=ps.name"
+" where ps.score>90");
/**
* 通过saveAsTable创建一张hive managed table,数据的元数据和数据即将放的具体位置都是由
* hive数据仓库进行管理的,当删除该表的时候,数据也会一起被删除(磁盘的数据不再存在)
*/
hiveContext.sql("drop table if exists peopleResult")
resultDF.saveAsTable("peopleResult")

/**
* 使用HiveContext的table方法可以直接读取hive数据仓库的Table并生成DataFrame,
* 接下来机器学习、图计算、各种复杂的ETL等操作
*/
val dataframeHive = hiveContext.table("peopleResult")
dataframeHive.show()


}
}


[b]调度脚本[/b]
并将上面的程序打包成SparkSQL2Hive.jar,将SparkSQL2Hive.jar拷贝到/usr/local/sparkApps/SparkSQL2Hive/目录下面,并创建调度脚本run.sh,内容如下:
/usr/local/spark/spark-1.6.0-bin-hadoop2.6/bin/spark-submit \
--class com.imf.spark.sql.SparkSQL2Hive \
--files /usr/local/hive/apache-hive-1.2.1-bin/conf/hive-site.xml \
--master spark://master1:7077 \
/usr/local/sparkApps/SparkSQL2Hive/SparkSQL2Hive.jar


#如果已经将msyql的驱动放到了spark的lib目录下面,则不用在添加下面的mysql的驱动了
#--driver-class-path /usr/local/hive/apache-hive-1.2.1-bin/lib/mysql-connector-java-5.1.35-bin.jar \


[b]执行结果[/b]

[img]http://dl2.iteye.com/upload/attachment/0116/5964/4a83b771-691e-3537-834f-77d1b75a2d1d.png[/img]

[b]详细执行的日志见附件[/b] run.log


[b]用hive来查看表内容和执行结果[/b]
root@master1:/usr/local/tools# hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/spark/spark-1.6.0-bin-hadoop2.6/lib/spark-assembly-1.6.0-hadoop2.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/spark/spark-1.6.0-bin-hadoop2.6/lib/spark-assembly-1.6.0-hadoop2.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

Logging initialized using configuration in jar:file:/usr/local/hive/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> show databases;
OK
default
testdb
Time taken: 1.013 seconds, Fetched: 2 row(s)
hive> use testdb;
OK
Time taken: 0.103 seconds
hive> show tables;
OK
people
peopleresult
peoplescores
student
student2
student3
student4
tbsogou
tmp_pre_hour_seach_info
Time taken: 0.082 seconds, Fetched: 9 row(s)
hive> select * from people;
OK
Michael 20
Andy 17
Justin 19
Time taken: 1.252 seconds, Fetched: 3 row(s)
hive> select * from peoplescores;
OK
Michael 98
Andy 95
Justin 68
Time taken: 0.142 seconds, Fetched: 3 row(s)
hive> select * from peopleresult;
OK
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Michael 20 98
Andy 17 95
Time taken: 0.298 seconds, Fetched: 2 row(s)
hive>


至此,通过SparkSQL操作hive数据库成功!
### 回答1: Spark SQL可以通过JDBC连接操作MySQL数据库,也可以通过HiveContext连接操作Hive数据仓库。对于MySQL数据库,需要先将MySQL的JDBC驱动包添加到Spark的classpath中,然后使用SparkSession的read和write方法读写MySQL表。对于Hive数据仓库,需要先启动Hive服务,并将Hive的JDBC驱动包添加到Spark的classpath中,然后使用HiveContext的sql方法执行HiveQL语句。 ### 回答2: Spark SQLSpark 的一个子模块,它支持对结构化数据进行处理和分析,同时 Spark SQL 可以与多种数据源进行集成和交互,其中包括 MySQL 数据库Hive 数据仓库。 Spark SQL 操作 MySQL 数据库的实现方式通常是通过 JDBC 驱动来实现的。首先需要在 Spark 的配置文件中添加 MySQL 驱动的相关配置信息,同时也需要将 MySQL 驱动的 JAR 包添加到 Spark 的 Classpath 中,然后就可以使用 Spark SQL 的数据源 API 将 MySQL 数据库中的数据载入到 Spark 的 DataFrame 中进行处理和分析了。 Spark SQL 操作 Hive 数据仓库的实现方式也较为简单,因为 Spark 提供了对 Hive 的原生支持,可以直接将 Hive 表作为 Spark SQL 的数据源进行处理和分析。在使用 Spark SQL 操作 Hive 数据仓库时,需要在 Spark 的配置文件中添加 Hive 的相关配置信息,同时也需要将 Hive 的 JAR 包添加到 Spark 的 Classpath 中,然后就可以在 Spark SQL 中使用 Hive 数据源 API 从 Hive 数据仓库中读取数据进行分析和处理。 总的来说,Spark SQL 操作 MySQLHive 数据仓库都比较方便,只需要配置好相关的驱动和参数,就可以像处理普通数据文件一样对这些数据进行查询和转换。此外,Spark SQL 还支持多种数据源的交互,包括 JSON,CSV,Parquet,Avro 和 ORC 等格式的数据文件。Spark SQL 的数据源兼容性很好,可以方便地与多种数据源进行集成使用,为分布式数据处理和分析带来更多的便利和灵活性。 ### 回答3: Spark SQL是以SQL语言为基础的Apache Spark模块。它支持从多种数据源中读取数据,进行数据操作和数据分析。其中,MySQL数据库Hive数据仓库都是比较常见的数据源之一。下面就分别介绍一下Spark SQL操作MySQLHive的方法和步骤。 1. Spark SQL操作MySQL数据库 步骤一:导入MySQL的JDBC driver Spark SQL需要使用MySQL JDBC driver来操作MySQL数据库,因此需要先将其导入到Spark代码中。可以在maven中央仓库中找到适合版本的MySQL JDBC driver,然后将其添加到项目中。 步骤二:连接MySQL数据库Spark SQL中,一般通过jdbc的方式来连接MySQL数据库。需要提供MySQL服务的IP地址和端口,数据库名称以及登录MySQL的用户名和密码。连接MySQL数据库的代码示例: ``` val jdbcDF = spark.read .format("jdbc") .option("url", "jdbc:mysql://mysqlip:3306/test") .option("dbtable", "userinfo") .option("user", "root") .option("password", "root") .load() ``` 上述代码中,将MySQL的IP地址和端口、数据库名称、表名、用户名和密码等信息封装在.option()中。 步骤三:操作MySQL数据库 连接成功后,即可对MySQL数据库进行操作Spark SQL操作MySQL的方式与操作DataFrame或SQL类似。例如: ``` jdbcDF.show() ``` 上述代码中,使用.show()方法来展示加载到DataFrame中的MySQL表的数据。 2. Spark SQL操作Hive数据仓库 步骤一:配置Hive Support 为了让Spark SQL支持Hive,需要在构建Spark时开启Hive Support。可以在Spark官网(https://spark.apache.org/downloads.html)下载已经包含了Hive Support的Spark压缩包,或者自行下载源码进行编译。 步骤二:连接Hive数据仓库 连接Hive数据仓库需要使用Hive JDBC driver。可以从Apache官网(https://hive.apache.org/downloads.html)下载Hive JDBC driver并添加到项目。 连接Hive数据仓库的代码示例: ``` val spark = SparkSession.builder() .appName("SparkHive") .master("local") .enableHiveSupport() .getOrCreate() ``` 上述代码中,通过.enableHiveSupport()方法开启Spark SQL支持Hive。创建完SparkSession后,即可连接Hive数据库。 步骤三:操作Hive数据库 连接成功后,即可在Spark SQL操作Hive数据库Spark SQL通过HiveQL来操作Hive数据库,与操作SQL语句类似。例如: ``` spark.sql("SELECT * FROM testdb.userinfo").show() ``` 上述代码中,使用sql()方法来执行SELECT语句,并展示结果。 综上,Spark SQL可以操作MySQLHive等多种数据源。操作MySQL需要导入MySQL JDBC driver,并通过jdbc连接MySQL数据库操作Hive需要在构建Spark时开启Hive Support,并导入Hive JDBC driver。操作数据库的代码与Spark SQL操作DataFrame和SQL基本一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值