spark连接hive(spark-shell和eclipse两种方式)
时间:2022-05-14
本文章向大家介绍spark连接hive(spark-shell和eclipse两种方式),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
转载请务必注明原创地址为:http://dongkelun.com/2018/03/25/sparkHive/
1、在服务器(虚拟机)spark-shell连接hive
1.1 将hive-site.xml拷贝到spark/conf里
cp /opt/apache-hive-2.3.2-bin/conf/hive-site.xml /opt/spark-2.2.1-bin-hadoop2.7/conf/
1.2 将mysql驱动拷贝到spark/jar里
cp /opt/apache-hive-2.3.2-bin/bin/mysql-connector-java-5.1.46-bin.jar /opt/spark-2.2.1-bin-hadoop2.7/jars/
1.3 启动spark-shell,输入代码测试
spark-shell
import org.apache.spark.sql.hive.HiveContext
val hiveContext = new HiveContext(sc)
hiveContext.sql("select * from test").show()
<!-- more -->
1.4 异常及解决
在执行hiveContext.sql("select * from test").show() 报了一个异常:
The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwxr-xr-x;
解决办法:
1.4.1 更改HDFS目录/tmp/hive的权限:
hadoop fs -chmod 777 /tmp/hive
1.4.2 同时删HDFS与本地的目录/tmp/hive:
hadoop fs -rm -r /tmp/hive
rm -rf /tmp/hive
这次错误采用的是第二种解决办法,有的情况下用第一种方法,比如一次在启动hive时候报这种错误~。
错误截图:
参考:http://www.cnblogs.com/czm1032851561/p/5751722.html
2、win10+eclipse上连接hive
2.1 将hive-site.xml拷贝到项目中的resources文件夹下
2.2 在sbt里添加对应版本的mysql依赖
"mysql" % "mysql-connector-java" % "5.1.46"
2.3 代码
2.3.1 旧版api(1.6以上)
package com.dkl.leanring.spark.sql
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.SparkContext
/**
* 旧版本spark-hive测试
*/
object OldSparkHiveDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("OldSparkHiveDemo").setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
val hiveCtx = new HiveContext(sc)
hiveCtx.sql("select * from test").show()
val data = Array((3, "name3"), (4, "name4"), (5, "name5"))
val df = sc.parallelize(data).toDF("id", "name")
df.createOrReplaceTempView("user")
hiveCtx.sql("insert into test select id,name from user")
hiveCtx.sql("select * from test").show()
}
}
(注:其中df.createOrReplaceTempView("user")改为df.registerTempTable("user"),因为createOrReplaceTempView方法是2.0.0才有的,registerTempTable是旧版的方法,1.6.0就有了,嫌麻烦就不改代码重新贴图了)
2.3.2 新版api
package com.dkl.leanring.spark.sql
import org.apache.spark.sql.SparkSession
/**
* 新版本spark-hive测试
*/
object NewSparkHiveDemo {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.master("local")
.config("spark.sql.warehouse.dir", "/user/hive/warehouse/")
.enableHiveSupport()
.getOrCreate()
import spark.implicits._
import spark.sql
sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")
val data = Array((1, "val1"), (2, "val2"), (3, "val3"))
var df = spark.createDataFrame(data).toDF("key", "value")
df.createOrReplaceTempView("temp_src")
sql("insert into src select key,value from temp_src")
sql("SELECT * FROM src").show()
}
}
2.4 异常及解决方法
在执行insert语句时会出现如下异常信息:
org.apache.hadoop.security.AccessControlException: Permission denied: user=dongkelun, access=EXECUTE, inode="/user/hive/warehouse":root...
原因是:启动 Spark 应用程序的win用户对spark.sql.warehouse.dir没有写权限
解决办法:
hadoop fs -chmod 777 /user/hive/warehouse/
附异常信息截图:
- hive数据:名词解释
- 巧妙使用exchange partition的一个案例(r6笔记第1天)
- r与rjava
- 使用expect运行动态脚本(r6笔记第19天)
- 数据库日志中一条"异常"信息所包含的细节(r6笔记第18天)
- linux下编辑VI窗口插入与编辑命令
- rman中三个不完全恢复场景(r6笔记第16天)
- 关于delete,drop,truncate的问题 (r6笔记第14天)
- R语言进行分析,比较详细的一篇,亲测过哦
- DeepMind 开源基于 MuJoCo 物理引擎强化学习工具 Control Suite
- hadoop常用的基本命令,HIVE复制文件,修改文件名
- gc服务器慢的原因分析 (r6笔记第14天)
- AI 玩微信跳一跳的正确姿势——跳一跳 Auto-Jump 算法详解
- 干货 | 深入理解Python装饰器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法