温故知新:初识hive

本文为学习笔记,会随着学习深入持续更新,仅供参考
一、hive是干什么的
        建立在hadoop上的数仓系统,可以将存储在hadoop中的结构化/半结构化数据映射成一张数据库表,提供基于sql的查询模型(HQL)。hive的核心是将HQL转化成mapReduce程序,然后将程序提交给hadoop集群去执行。


二、hive实现基本原理和基本组件

image.png

元数据:映射关系,包括:表的类型、存储位置、属性、字段顺序等。元数据可以存储在内置库中也可以存在第三方库中(如:mysql),外边服务想要访问元数据需要通过元数据服务(MetaStore)实现。生产环境常配置为远程模式
1、hive和mysql的区别
image.png

hive需要现有文件在映射出表
mysql是现有表结构在插入数据
2、hive的分区分桶应用场景
        分区使用的是表外数据,比如按照时间进行分区,是一个大粒度划分,如果分区后数据还是太多,可以通过分桶,即根据表内字段进行进细粒度划分,类似于一个树形结构。
参考链接
3、HIVE数据的压缩与存储格式
        使用压缩技术,减少数据大小,提高传输效率。
image.png

4、hive的多级分区是什么
        通过将数据按多个维度进行分区,可以显著提高查询性能和数据管理的效率。举例:假设我们有一个电商网站的订单数据,需要按年、月、日进行分区存储。这样,我们可以方便地按时间范围查询订单数据,并且可以轻松地管理和清理历史数据。

#建表
CREATE TABLE IF NOT EXISTS orders (
    order_id STRING,
    customer_id STRING,
    amount DOUBLE
)
PARTITIONED BY (year STRING, month STRING, day STRING)
STORED AS ORC;

#在sprignboot中实现
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void createPartitionedTable() {
        String createTableQuery = "CREATE TABLE IF NOT EXISTS orders (" +
                                  "order_id STRING, " +
                                  "customer_id STRING, " +
                                  "amount DOUBLE" +
                                  ") PARTITIONED BY (year STRING, month STRING, day STRING) " +
                                  "STORED AS ORC";
        jdbcTemplate.execute(createTableQuery);
    }

    public void insertOrder(String orderId, String customerId, double amount, String year, String month, String day) {
        String insertQuery = String.format(
            "INSERT INTO TABLE orders PARTITION (year='%s', month='%s', day='%s') VALUES ('%s', '%s', %f)",
            year, month, day, orderId, customerId, amount
        );
        jdbcTemplate.execute(insertQuery);
    }

    public List<Map<String, Object>> queryOrders(String year, String month, String day) {
        String query = String.format("SELECT * FROM orders WHERE year='%s' AND month='%s' AND day='%s'", year, month, day);
        return jdbcTemplate.queryForList(query);
    }
}


三、常用API
1、基本操作语句
        hive的表是分内部表和外部表的。内部表就包含元数据和实际数据,外部表是只包含元数据,用于关联一些文件等。
内部表(Managed Table)适用场景:
a) 数据完全由Hive管理:如果数据的生命周期完全在Hive中管理,
b) 临时或中间数据:用于临时分析、实验或中间结果存储。
c) 全新的数据集:当你从其他数据源导入数据并希望Hive接管其管理时
外部表(External Table)适用场景:
a) 共享数据:数据需要被多个工具或框架共享,如Spark、Pig等。外部表允许你在Hive中定义表结构,而不改变数据的实际存储位置。
b) 现有数据集:数据已经存在于HDFS或其他存储系统中,你希望在Hive中对其进行查询和分析,但不希望Hive管理数据的生命周期。
d) 数据保留策略:当你希望保留数据,即使删除了表结构定义。删除外部表只会删除表的元数据信息,不会删除实际的数据文件。
e) 分区管理复杂:当你需要手动管理分区数据,或者分区数据由外部系统生成和管理时,外部表可以更灵活地处理这些情况。
        下面以hive实现hdfs数据读取和写入全流程为例进行说明:
        Default数据仓库的最原始位置是在hdfs上的:/user/hive/warehouse路径下。只有在这个路径下才能实现hive的表和文件自动关联。
1、配置mysql库存储元数据
        即配置Hive的conf/hive-site.xml文件,添加MySQL的连接信息。
2、实现数据导入导出逻辑

-- 创建一个表
CREATE TABLE my_table (id INT, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/user/hive/warehouse/my_table';
 
-- 将数据放入HDFS的表位置
put my_data.csv /user/hive/warehouse/my_table;
 
-- 从HDFS读取数据
SELECT * FROM my_table;
 
-- 将查询结果写入到新的HDFS位置
INSERT OVERWRITE DIRECTORY '/user/hive/warehouse/new_table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
SELECT * FROM my_table;

四、在springboot中实现hive从hadoop导入导出数据
1、hive中配置jdbc
2、hive中建表(见上边)
2、springboot中实现数据导入导出

1、pom添加依赖
复制代码<dependencies>

    <!-- Hive JDBC Driver -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>3.1.2</version>
    </dependency>

    <!-- Hadoop Common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.2.1</version>
    </dependency>

    <!-- Hadoop Client -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.2.1</version>
    </dependency>
</dependencies>

2、在Spring Boot应用中配置Hive连接:
# application.properties

spring.datasource.url=jdbc:hive2://your_hive_server:10000/default
spring.datasource.username=hive_user
spring.datasource.password=hive_password
spring.datasource.driver-class-name=org.apache.hive.jdbc.HiveDriver


3、使用JdbcTemplate执行SQL语句进行数据导入和导出:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

@Service
public class HiveService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void executeQuery(String query) {
        jdbcTemplate.execute(query);
    }

    public void loadDataFromHDFS(String hdfsFilePath, String hiveTableName) {
        String query = String.format("LOAD DATA INPATH '%s' INTO TABLE %s", hdfsFilePath, hiveTableName);
        executeQuery(query);
    }

    public void exportDataToHDFS(String hiveTableName, String hdfsDirPath) {
        String query = String.format("INSERT OVERWRITE DIRECTORY '%s' SELECT * FROM %s", hdfsDirPath, hiveTableName);
        executeQuery(query);
    }
}


补充介绍下zookeeper
zk是一个分布式小文件存储器,支持主从模式,具有全局数据一致性特点,就是每个节点都有一份完整数据。主要用来解决分布式应用中数据管理问题,如:状态同步、集群选举管理、应用配置项管理等。
1、怎么保障全局数据一致性?
leader把所有事务性请求编号,然后依次执行。
2、怎么协调数据管理?
具有监听机制(客户端发起zk会启动监听),数据发布订阅(分布式环境配置统一配置中心,监听支持实时更新),选举(监听触发),分布式锁。以上上这几个主要功能都是以监听机制为基础进行的。


参考链接
1、Hive手册
2、Hive内部表、外部表区别是?分区表如何使用?为什么要分桶?
3、Hive-表数据的导出、导入(HDFS、本地)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容