说明:spark版本:2.2.0

    hive版本:1.2.1

需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spark-sql程序实现将该文件读取并以parquet的格式通过外部表的形式保存到hive中,最终要实现通过传参的形式,将该日期区间内的csv文件批量加载进去,方式有两种:

  1、之传入一个参数,说明只加载一天的数据进去

  2、传入两个参数,批量加载这两个日期区间的每一天的数据

  最终打成jar包,进行运行

步骤如下:

  1、初始化配置,先创建sparkSession(spark2.0版本开始将sqlContext、hiveContext同意整合为sparkSession)

//初始化配置
val spark = new sql.SparkSession
  .Builder()
.enableHiveSupport()  //操作hive这一步千万不能少
.appName("project_1")
.master("local[2]")
.getOrCreate()

  2、先将文件读进来,并转换为DF 

val data = spark.read.option("inferSchema", "true").option("header", "false") //这里设置是否处理头信息,false代表不处理,也就是说文件的第一行也会被加载进来,如果设置为true,那么加载进来的数据中不包含第一行,第一行被当作了头信息,也就是表中的字段名处理了
.csv(s"file:///home/spark/file/project/${i}visit.txt")  //这里设置读取的文件,${i}是我引用的一个变量,如果要在双引号之间引用变量的话,括号前面的那个s不能少
.toDF("mac", "phone_brand", "enter_time", "first_time", "last_time", "region", "screen", "stay_time") //将读进来的数据转换为DF,并为每个字段设置字段名

  3、将转换后的DF注册为一张临时表

data.createTempView(s"table_${i}")

  4、通过spark-sql创建hive外部表,这里有坑

spark.sql(
s"""
|create external table if not exists ${i}visit
|(mac string, phone_brand string, enter_time timestamp, first_time timestamp, last_time timestamp,
|region string, screen string, stay_time int) stored as parquet
|location 'hdfs://master:9000/project_dest/${i}'
""".stripMargin)

  这里的见表语句需要特别注意,如果写成如下的方式是错误的:

spark.sql(
s"""
|create external table if not exists ${i}visit
|(mac string, phone_brand string, enter_time timestamp, first_time timestamp, last_time timestamp,
|region string, screen string, stay_time int) row format delimited fields terminated by '\t' stored as parquet
|location /project_dest/${i}'
""".stripMargin)

    (1)对于row format delimited fields terminated by '\t'这语句只支持存储文件格式为textFile,对于parquet文件格式不支持

    (2)对于location这里,一定要写hdfs的全路径,如果向上面这样写,系统不认识,切记

  5、通过spark-sql执行insert语句,将数据插入到hive表中

spark.sql(s"insert overwrite table ${i}visit select * from table_${i}".stripMargin)

  至此,即完成了将本地数据以parquet的形式加载至hive表中了,接下来既可以到hive表中进行查看数据是否成功载入

贴一下完整代码:

package _sql.project_1

import org.apache.spark.sql

/**
* Author Mr. Guo
* Create 2018/9/4 - 9:04
* ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
* │Esc│ │ F1│ F2│ F3│ F4│ │ F5│ F6│ F7│ F8│ │ F9│F10│F11│F12│ │P/S│S L│P/B│ ┌┐ ┌┐ ┌┐
* └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ └┘ └┘ └┘
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
* │~ `│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ BacSp │ │Ins│Hom│PUp│ │N L│ / │ * │ - │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
* │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│ | \ │ │Del│End│PDn│ │ 7 │ 8 │ 9 │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │
* │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter │ │ 4 │ 5 │ 6 │ │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤
* │ Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │
* ├─────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ E││
* │ Ctrl│ │Alt │ Space │ Alt│ │ │Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │←─┘│
* └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
**/ object Spark_Sql_Load_Data_To_Hive {
//初始化配置
val spark = new sql.SparkSession
.Builder()
.enableHiveSupport()
.appName("project_1")
.master("local[2]")
.getOrCreate() //设置日志的级别
spark.sparkContext.setLogLevel("WARN") def main(args: Array[String]): Unit = { try {
if (args.length != 1) {
data_load(args(0).toInt)
} else if (args.length != 2) {
for (i <- args(0).toInt to args(1).toInt) {
data_load(i)
}
} else {
System.err.println("Usage:<start_time> or <start_time> <end_time>")
System.exit(1)
}
}catch {
case ex:Exception => println("Exception")
}finally{
spark.stop()
}
}
def data_load(i:Int): Unit = {
println(s"*******data_${i}********")
val data = spark.read.option("inferSchema", "true").option("header", "false")
.csv(s"file:///home/spark/file/project/${i}visit.txt")
.toDF("mac", "phone_brand", "enter_time", "first_time", "last_time", "region", "screen", "stay_time")
data.createTempView(s"table_${i}")
spark.sql("use project_1".stripMargin)
spark.sql(
s"""
|create external table if not exists ${i}visit
|(mac string, phone_brand string, enter_time timestamp, first_time timestamp, last_time timestamp,
|region string, screen string, stay_time int) stored as parquet
|location 'hdfs://master:9000/project_dest/${i}'
""".stripMargin)
spark
.sql(s"insert overwrite table ${i}visit select * from table_${i}".stripMargin)
}
}

    6、打成jar包(我的IDEA版本是2017.3版本)

  如果没有上面这一栏,点击View,然后勾选Toolbar即可

点击ok

此时这里会成成这么一个文件,是编译之后的class文件

到这个目录下会找到这么一个jar包

找到该文件夹,上传到服务器,cd到该目录下运行命令:

spark-submit  --class spark._sql.project_1.Conn_hive --master spark://master:7077 --executor-memory 2g --num-executors 3  /spark_maven_project.jar 20180901 20180910

关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中的更多相关文章

  1. jmeter读取本地CSV文件

    用jmeter录制考试上传成绩等脚本时,出现的问题及解决方法如下: 1.beanshell前置处理器,不能读取本地csv文件里的数据: 方法一: 在beanshell里不能直接从本地的csv文件里读取 ...

  2. Mysql加载本地CSV文件

    Mysql加载本地CSV文件 1.系统环境 系统版本:Win10 64位 Mysql版本: 8.0.15 MySQL Community Server - GPL Mysql Workbench版本: ...

  3. 读取gzmt.csv文件,计算均值及概率

    问题: 读取gzmt.csv文件所有数据,选取收盘价格(倒数第二列),计算20天均值,权重取成交量(选做:时间权重为半衰期为15天):将该均值修剪为超过600的都设置为1000,并打印出该均值超过55 ...

  4. 读取本地json文件,并转换为dictionary

    // 读取本地JSON文件 - (NSDictionary *)readLocalFileWithName:(NSString *)name { // 获取文件路径 NSString *path = ...

  5. jQuery ajax读取本地json文件

    jQuery ajax读取本地json文件 json文件 { "first":[ {"name":"张三","sex": ...

  6. JavaScript读取本地json文件

    JavaScript读取本地json文件 今天调试了一上午,通过jQuery读取本地json文件总是失败,始终找不出原因,各种方法都试了 开始总以为是不是json格式的问题.高了半天不行 后来读了一个 ...

  7. 读取本地json文件,转出为指定格式json 使用Base64进行string的加密和解密

    读取本地json文件,转出为指定格式json   引用添加Json.Net 引用命名空间 using Newtonsoft.Json //读取自定目录下的json文件StreamReader sr = ...

  8. JAVA读取本地html文件里的html文本

    /** * 读取本地html文件里的html代码 * @param file File file=new File("文件的绝对路径") * @return */ public s ...

  9. C语言读取写入CSV文件 [一]基础篇

    本系列文章目录 [一] 基础篇 [二] 进阶篇--写入CSV [三] 进阶篇--读取CSV 什么是CSV? CSV 是一种以纯文本形式存储的表格数据,具体介绍如下(来自维基百科): 逗号分隔值(Com ...

随机推荐

  1. C语言动态链表数据结构

    链表的操作增删改查 typedef int DATA; struct SNode { DATA data; SNode* pNext; }; SNode* g_head=NULL;//全局变量 //从 ...

  2. Bootstrap3基础 bg-danger/info... 辅助类样式 背景文本颜色

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  3. linux内核中的PTP clock是什么?

    答: Precise Time Protocol(PTP),这是一种高精度时间同步协议,PTP是在硬件级实现的,因此需要硬件支持才能实现高精度时间同步

  4. Hakase and Nano 【思维博弈】

    Hakase and Nano 时间限制: 1 Sec  内存限制: 128 MB 提交: 400  解决: 104 [提交] [状态] [命题人:admin] 题目描述 Hakase and Nan ...

  5. bzoj4008: [HNOI2015]亚瑟王 dp

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4008 思路 神仙啊 \(f[i][j]表示第i个点有j次机会(不管成功与否)\) \(f ...

  6. 清理本地Maven仓库

    目录 1.清理target 2.清理该项目依赖的本地仓库中的maven包 3.清理maven本地仓库中下载失败的包 参考: 1.清理target mvn clean -U 2.清理该项目依赖的本地仓库 ...

  7. SpringBoot 使用Mybatis-Plus

    简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 特性 无侵入:Mybatis-Plus 在 My ...

  8. sql 之 INSERT IGNORE

    INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.这样就可以保留 ...

  9. HIHOcoder 1441 后缀自动机一·基本概念

    思路 SAM的概念题 暴力模拟就好了 代码 #include <cstdio> #include <cstring> #include <algorithm> #i ...

  10. Java基础【基本数据类型包装类、int与String 之间的相互转换】

    为什么会有基本类型包装类? 将基本类型数据类型封装成对象,这样的好处可以在对象中定义更多方法操作该数据. 包装类常用的操作就是用于基本数据类型与字符串之间的转换 问题:int a=100; 为什么不能 ...