Spark读写Hive
一、 配置本地域名映射
(一) 查看集群配置
在Linux查看hosts文件:
vi /etc/hosts
(二) 配置域名
将Linux中查看到的域名配置到Windows本地的hosts文件中:
C:\Windows\System32\drivers\etc\hosts
**注意:**此文件有权限限制,不能直接修改。
**修改办法:**搜索记事本,使用管理员身份打开记事本,然后从记事本打开hosts文件,然后再修改。
二、 创建Hive表
(一) 启动Hadoop集群
要保证Hadoop集群是正常启动的。master和slave1节点上要能看到namenode守护进程。
(二)编写数据
1Linux本地编辑一个t_student.txt文件:
vi ~/t_student.txt
2写入数据,保存并退出。
1,zhangsan,male,182,lisi,female,20
(三)上传文件到HDFS根目录
hdfs dfs -put ~/.t_student.txt /
(四)进入hive
hive
(五)创建数据库
--创建数据库create database sparktest;
--使用数据库use spark test;
--创建表create table student(id int, name string, gender string, age int) row format delimited fields terminated by "," stored as textfile ;--row format delimited fields terminated by "," 指定列分隔符为英文的逗号--stored as textfile 存储为文本文件
--加载数据load data inpath "/t_student.txt" overwrite into table student;--load data加载数据--inpath 指定路径--"/t_student.txt" 具体的HDFS的路径--overwrite into 覆盖写入--table 指定表--student 具体的表名
当执行完load data操作后,hdfs根目录下的t_student.txt文件会被移动到hive的数据目录下。
(六)查看数据
select * from student;
三、 IDEA中编写Spark代码读取Hive数据
(一) 环境配置
将hive-site.xml(路径:HIVE_HOME/conf)、core-site.xml、hdfs-site.xml(路径:HADOOP_HOME/etc/hadoop)复制到IDEA项目的resource目录下。
(二) 编写代码
import org.apache.spark.sql.SparkSession
/*** 使用DataFrame读取Hive表*/object spark_read_hive { def main(args: Array[String]): Unit = {
//指定本地用户为root System.setProperty("HADOOP_USER_NAME","root")
//创建SparkSession,作用:连接Spark val spark = SparkSession .builder() .master("local[*]") //指定运行的方式哦 .appName("spark_read_hive") //程序的名字 .enableHiveSupport() //开启Hive支持 .getOrCreate()
//查询Hive表 //sparktest.student 数据库名.表名 val df = spark.sql("select * from student"); df.show()}}
四、 IDEA中编写Spark代码写入数据到Hiv
import org.apache.spark.sql.{Row, SaveMode, SparkSession}import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
/*** 使用DataFrame写入数据到Hive*/object spark_write_hive { def main(args: Array[String]): Unit = {
//指定本地用户为root System.setProperty("HADOOP_USER_NAME", "root")
//创建SparkSession,作用:连接Spark val spark = SparkSession .builder() .master("local[*]") //指定运行的方式 .appName("spark_write_hive") //程序的名字 .enableHiveSupport() //开启Hive支持 .config("hive.exec.dynamic.partition", "true")//允许动态分区 .config("hive.exec.dynamic.partition.mode", "nonstrict")//允许非严格动态分区 .getOrCreate()
//创建DataFrame //1. 创建schema val schema = StructType(List( StructField("id", IntegerType, true), StructField("name", StringType, true), StructField("gender", StringType, true), StructField("age", IntegerType, true) ))
//2. 创建rows //2.1 创建RDD val dataRDD = spark.sparkContext.parallelize(Array( Array(3, "zhangsan", "男", 18), Array(4, "lisi", "女", 20) )) //2.2 创建rows val rows = dataRDD.map(x => Row(x(0), x(1), x(2), x(3))) //3. 合并 val df = spark.createDataFrame(rows, schema)
//df.show()
//写入Hive //方法一:通过临时表使用SQL语句添加数据 // df.createOrReplaceTempView("tmpTable") // spark.sql("insert into student select * from tmpTable")
//方法二:通过DataFrame直接写入hive表 df.write.mode(SaveMode.Append) .format("hive")//指定写入的表是Hive .partitionBy("name")//指定分区为name字段 .saveAsTable("sparktest.student")}}