一百一十一、Hive——从HDFS到Hive的数据导入(静态分区、动态分区)

这篇具有很好参考价值的文章主要介绍了一百一十一、Hive——从HDFS到Hive的数据导入(静态分区、动态分区)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、分区的定义

分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹, Hive 中的分区就是分目录 ,把一个大的数据集根据业务需要分割成小的数据集。
在查询时通过 where 子句中的表达式选择查询所需要的指定的分区,这样的查询效率
会提高很多,所以我们需要把常常用在where 语句中的字段指定为表的分区字段。
而分区又分为静态分区、动态分区两种。

二、静态分区、动态分区对比

静态分区与动态分区的主要区别在于静态分区是手动指定,是编译时进行分区。支持load和insert两种插入方式。适合于分区数少、分区名可以明确的数据

而动态分区是通过数据来进行判断,是在SQL执行时进行分区。只支持inset这一种插入方式。需要先开启动态设置。实际项目里按日期进行分区的数据一般都是动态分区

三、HDFS数据准备

(一)HDFS文件后缀名以日期区分

hdfs导入hive,Hive,hive,hdfs,hadoop

(二)查看数据样式

hdfs导入hive,Hive,hive,hdfs,hadoop

四、Hive建普通外部表  不分区

(一)建表语句

create external table if not exists ods_evaluation(
    device_no  string         COMMENT '设备编号',
    cycle  int                COMMENT '评价数据周期',
    lane_num  int,
    create_time  timestamp    COMMENT '创建时间',
    lane_no int               COMMENT '车道编号',
    volume int                COMMENT '车道内过停止线流量(辆)',
    queue_len_max float       COMMENT '车道内最大排队长度(m)',
    sample_num int            COMMENT '评价数据计算样本量',
    stop_avg int              COMMENT '车道内平均停车次数(次)',
    delay_avg float           COMMENT '车道内平均延误时间(s)',
    stop_rate float           COMMENT '车道内一次通过率',
    travel_dist float         COMMENT '车道内检测行程距离(m)',
    travel_time_avg float     COMMENT '车道内平均行程时间'
)
comment '评价数据表'
row format delimited fields terminated by ','
stored as  textfile  location '/rtp/evaluation'
tblproperties("skip.header.line.count"="1")  ;

(二)结果展示  共9076条数据

hdfs导入hive,Hive,hive,hdfs,hadoop

五、静态分区

(一)建表语句

create external table if not exists ods_evaluation_static(
    device_no  string         COMMENT '设备编号',
    cycle  int                COMMENT '评价数据周期',
    lane_num  int,
    create_time  timestamp    COMMENT '创建时间',
    lane_no int               COMMENT '车道编号',
    volume int                COMMENT '车道内过停止线流量(辆)',
    queue_len_max float       COMMENT '车道内最大排队长度(m)',
    sample_num int            COMMENT '评价数据计算样本量',
    stop_avg int              COMMENT '车道内平均停车次数(次)',
    delay_avg float           COMMENT '车道内平均延误时间(s)',
    stop_rate float           COMMENT '车道内一次通过率',
    travel_dist float         COMMENT '车道内检测行程距离(m)',
    travel_time_avg float     COMMENT '车道内平均行程时间'
)
comment '评价历史数据表 静态分区'
partitioned by (day string)   --分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
row format delimited fields terminated by ','
tblproperties("skip.header.line.count"="1")  ;

注意点:

1、指定的分区字段不能是表中已经存在的数据  我这边分区字段为day  而表中没有这个字段

2、建表没有指定文件路径

(二)加载数据(有坑)

注意:从HDFS中加载数据到Hive,如果直接load HDFS中的数据到Hive中,那么原HDFS数据文件就会消失在原路径,而是去了一个hive的新地方。直接load,这种行为它类似于剪切,而不是我们所希望的复制文件。 这是一个坑!!!

所以如果我们希望既可以load数据到hive,还能够保存HDFS的原文件,那么必须采用迂回策略,从HDFS先到本地,再load到Hive。比如加载HDFS中2023-05-09的数据

先从HDFS到l本地  /opt/hdfs_rtp/

[root@hurys22 conf]# hdfs dfs -get /rtp/evaluation/evaluation2023-05-09.csv /opt/hdfs_rtp/

从本地加载到Hive

load data local inpath '/opt/hdfs_rtp/evaluation2023-05-09.csv'
into  table  ods_evaluation_static
partition(day='2023-05-09');

(三)查看分区

show partitions ods_evaluation_static;

hdfs导入hive,Hive,hive,hdfs,hadoop

(四)查看数据

hdfs导入hive,Hive,hive,hdfs,hadoop

 六、动态分区

(一)建表语句

create external table if not exists ods_evaluation_trends(
    device_no  string         COMMENT '设备编号',
    cycle  int                COMMENT '评价数据周期',
    lane_num  int,
    create_time  timestamp    COMMENT '创建时间',
    lane_no int               COMMENT '车道编号',
    volume int                COMMENT '车道内过停止线流量(辆)',
    queue_len_max float       COMMENT '车道内最大排队长度(m)',
    sample_num int            COMMENT '评价数据计算样本量',
    stop_avg int              COMMENT '车道内平均停车次数(次)',
    delay_avg float           COMMENT '车道内平均延误时间(s)',
    stop_rate float           COMMENT '车道内一次通过率',
    travel_dist float         COMMENT '车道内检测行程距离(m)',
    travel_time_avg float     COMMENT '车道内平均行程时间'
)
comment '评价历史数据表 动态分区'
partitioned by (day string)
row format delimited fields terminated by ',';

注意:由于动态分区不是load文件,所以建表时不需要截掉第一行数据 tblproperties("skip.header.line.count"="1")

(二)开启动态分区

--开启动态分区功能(默认 true,开启)
set hive.exec.dynamic.partition=true;
--设置为非严格模式   nonstrict 模式表示允许所有的分区字段都可以使用动态分区
set hive.exec.dynamic.partition.mode=nonstrict;
--在每个执行 MR 的节点上,最大可以创建多少个动态分区
set hive.exec.max.dynamic.partitions.pernode=1000;
--在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000
set hive.exec.max.dynamic.partitions=1500;

(三)动态加载数据(insert overwrite)

insert  overwrite table ods_evaluation_trends partition(day)
select device_no, cycle, lane_num, create_time, lane_no, volume, queue_len_max, sample_num, stop_avg, delay_avg, stop_rate,
       travel_dist, travel_time_avg,date(create_time) day
from ods_evaluation;

注意insert overwrite的用法

insert into 与 insert overwrite 都可以向hive表中插入数据,但是insert into是直接追加到目前表中数据的尾部,而insert overwrite则会重写数据,即先删除数据,再写入数据。如果存在分区的情况,insert overwrite只重写当前分区

(四)查看动态分区

show  partitions ods_evaluation_trends;

hdfs导入hive,Hive,hive,hdfs,hadoop

 (五)查看数据

hdfs导入hive,Hive,hive,hdfs,hadoop文章来源地址https://www.toymoban.com/news/detail-527202.html

到了这里,关于一百一十一、Hive——从HDFS到Hive的数据导入(静态分区、动态分区)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第一百一十八回 如何获取蓝牙连接状态

    我们在上一章回中介绍了如何连接蓝牙设备相关的内容,本章回中将介绍如何获取蓝牙连接状态.闲话休提,让我们一起Talk Flutter吧。 我们在上一章回中介绍如何连接蓝牙设备,但是如何知道蓝牙设备是否连接成功呢?这就需要我们去获取蓝牙设备的连接状态,通过蓝牙设备

    2024年02月12日
    浏览(42)
  • Android之关机/重启/recovery模式(一百一十五)

    1.方式一:App调用系统api 2.方式二:setprop 注意:在init的reboot.c中,           adb reboot -p命令其实就是调用的setprop命令开关机的。  3.方式三:

    2024年02月14日
    浏览(31)
  • 第一百一十二回 flutter_screenutil包

    我们在上一章回中介绍了屏幕适配相关的内容,本章回中将介绍 flutter_screenutil 包,该包主要用来实现屏幕适配.闲话休提,让我们一起Talk Flutter吧。 我们在本章回中介绍的包是 flutter_screenutil ,它主要用来做屏幕和字体大小的适配,它的实现原理和我们在上一章回中介绍的屏幕

    2024年02月13日
    浏览(40)
  • Emacs之改造最快文本搜索工具ripgrep(一百一十九)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2024年02月15日
    浏览(32)
  • Emacs之实现跨程序选中自动复制功能(一百一十八)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2024年02月15日
    浏览(44)
  • C/C++基础讲解(一百一十九)之经典篇(最优美的图案)

    很多时候,特别是刚步入大学的学子们,对于刚刚开展的计算机课程基本上是一团迷雾,想要弄明白其中的奥秘,真的要花费一些功夫,我和大家一样都是这么啃过来的,从不知到知知,懵懂到入门,每一步都走的很艰辛,课程上,大学老师基本上讲解上机实操得时间特别有

    2024年02月09日
    浏览(37)
  • 客快物流大数据项目(一百一十七):网关 Spring Cloud Gateway

    文章目录 网关 Spring Cloud Gateway 一、简介 1、功能特性

    2024年02月04日
    浏览(65)
  • 第一百一十五天学习记录:C++提高:STL初识(黑马教学视频)

    1、长久以来,软件界一直希望建立一种可重复利用的东西 2、C++的面向对象和泛型编程思想,目的就是重复性的提升 3、大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 4、为了建立数据结构和算法的一套标准,诞生了STL 1、STL,标准模板库 2、

    2024年02月16日
    浏览(35)
  • 第一百一十三天学习记录:C++提高:类模板(黑马教学视频)

    类模板作用: 建立一个通用类,类中的成员 数据类型可以不具体定制,用一个虚拟的类型来代表。 语法: 解释: template … 声明创建模板 typename … 表面其后面的符号是一种数据类型,可以用class代替 T … 通用的数据类型,名称可以替换,通常为大写字母 总结:类模板和函

    2024年02月16日
    浏览(27)
  • 二百一十、Hive——Flume采集的JSON数据文件写入Hive的ODS层表后字段的数据残缺

    在用Flume把Kafka的数据采集写入Hive的ODS层表的HDFS文件路径后,发现HDFS文件中没问题,但是ODS层表中字段的数据却有问题,字段中的JSON数据不全 1、ODS层建静态分区外部表,Flume直接写入ODS层表的HDFS路径下 2、用get_json_object进行解析 注意 :使用JsonSerDe时,每行必须是一个完整

    2024年02月03日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包