• hive从入门到放弃(三)——DML数据操作


    上一篇给大家介绍了 hive 的 DDL 数据定义语言,这篇来介绍一下 DML 数据操作语言。

    没看过的可以点击跳转阅读:
    hive从入门到放弃(一)——初识hive
    hive从入门到放弃(二)——DDL数据定义

    数据写入

    数据导入部分默认数据文件格式为 textfile,每一列由‘,’进行分割,以换行分行。

    insert

    insert 表示向表中插入数据,可以直接插入值,也可以通过查询其他表获取数据插入。

    INSERT INTO TABLE target_table VALUES (COL1.VALUE, COL2.VALUE, ...);
    INSERT OVERWRITE TABLE target_table SELECT COL1, COL2, ... FROM source_table;
    

    insert into 以追加数据的方式插入到表或分区,原有数据不会删除;

    insert overwrite 则是覆盖原来的数据。

    load

    load data [local]① inpath② 'src_path' [overwrite] into table 
    target_table [partition (partcol1=val1,…)];
    

    ① local 加上此关键字则表示从本地加载数据,不加的话就是从 HDFS 加载;

    ② inpath 后接要导入的数据文件的路径

    数据导出

    insert 方式导出

    1)将查询的结果导出到本地

    insert overwrite local directory 'local_path' select * from table_name;
    

    2)将查询的结果格式化导出到本地(以'/t'结尾的格式分隔字段)

    insert overwrite local directory 'local_path'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    select * from table_name;
    

    3)将查询的结果格式化导出到 HDFS 上

    insert overwrite directory 'HDFS_PATH'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
    select * from table_name;
    

    HDFS 命令方式导出

    由于 hive 的数据文件是在 HDFS 上的,因此可以用 HDFS 命令导出。

    在 hive CLI 中,只需要将 Hadoop 命令中将‘hdfs’关键字去掉即可,比如:

    dfs -get /user/hive/warehouse/src_path  /local_target_path;
    

    Hive Shell 命令导出

    基本语法:" hive -f/-e 执行语句或者脚本 > file "

    bin/hive -e 'select * from table_name;' > local_target_path;
    

    Export & Import

    hive 在0.8.0以后的版本中提供了 Export 和 Import 的导数方式

    export 可以将数据导出到 HDFS 上,导出数据的同时还会生成一个元数据文件,其用法如下:

    export table table_name to 'HDFS_PATH';
    

    import 可将数据导入指定的表中,但导入的数据需要元数据,因此需要配合 export 使用

    import table table_name from 'HDFS_PATH';
    

    注意:export/import 命令中的路径必须是目录,而不能是文件

    清除数据

    truncate table table_name;
    

    truncate 只能清除管理表的数据,不能清除外部表数据

    查询数据

    查询的语句和大部分的数据库查询 SQL 一样:

    SELECT * FROM table_name WHERE condition GROUP BY col1 ORDER BY col2 LIMIT 1;
    

    因此这里只介绍不同或者需要注意的地方。

    like 和 rlike

    like 和大部分数据库的用法一样,可用于选择类似的值,% 代表零个或多个字符(任意个字符)。
    _ 代表一个字符;

    rlike 则可以用于匹配正则表达式

    select * from table_name where col1 RLIKE '[A]';
    

    排序(重点)

    hive 的排序关键字有多个,而且每个对应的应用场景也不相同。

    order by

    order by 全局排序,在 MapReduce 程序中是将所有数据进行排序,因此只有一个 Reducer

    select col1, col2 from table_name order by col1 desc;
    

    sort by

    order by 在处理大规模的数据集效率较低。

    在很多情况下,并不需要全局排序,此时可以使用 sort by。

    Sort by 为每个 reducer 产生一个排序文件。

    每个 Reducer 内部进行排序,但对全局结果集来说无序。

    select * from table_name sort by col1 desc;
    

    distribute by

    在某些场景,我们需要控制某条数据应该到哪个 reducer,一般是为了进行后续的聚集操作。

    distribute by 类似 MR 中的 partition(自定义分区),可以对数据进行分区,结合 sort by 使用。

    distribute by 要分配多个 reduce 进行处理,否则无法看到 distribute by 的效果。

    distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后,
    余数相同的分到一个区。

    select * from table_name distribute by col1 sort by col2 desc;
    

    Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。

    cluster by

    当 distribute by 和 sort by 字段相同时,可以使用 cluster by 方式。

    cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。

    但是排序只能是升序,不能指定排序规则为 ASC 或者 DESC。

    -- 这两条 SQL 语句效果相同
    select * from table_name cluster by col1; 
    select * from table_name distribute by col1 sort by col1;
    

    小结

    本文介绍了 hive DML 数据操作,主要介绍了一些 hive 特有的关键字和用法。

    对于 hive SQL 而言,它的很多语法和常用函数和其它关系型数据库类似,比如 hiving,count(),min()等,这些的用法相信大家都比较熟悉

    当然有个别还是有所不同,具体使用场景可以查阅相关资料。

    转载请注明出处,关注【大数据的奇妙冒险】,解锁更多新知识!

  • 相关阅读:
    Flutter 内嵌原生组件 for ios
    C++指针常量,常量指针以及, 引用和指针的区别
    Pow(x, n)
    渗透测试越权访问问题解决(非正式)
    在 Windows 中使用 System Settings
    【算法练习Day8】 kmp算法&&找出字符串中第一个匹配项的下标&&反转字符串中的单词&&重复的子字符串
    企业现代化管理模式,数据指标体系应该如何构建?
    【iMessage苹果相册推位置推】“MFI授权计划”是指一个零丁的苹果程序开发
    R语言实现竞争风险模型(1)
    第十七天笔记
  • 原文地址:https://www.cnblogs.com/lyuzt/p/16029799.html