Hive往表写入数据的八种方法

1. 使用insert......select......\

语法:

insert overwrite table dest_table partition(dt='xxxxxx')selectc1,c2from src_tablewhere......
复制代码

select中的字段顺序与dest_table的一定要一致,字段名与dest_table的最好要一致。

  • 映射时是以字段顺序为准,不以字段名或字段别名为准。
  • insert overwrite是覆盖目的路径下已存在的数据文件。
  • insert into是继续添加记录,该路径下之前的数据依然存在。
  • 会自动添加新分区信息,会自动新建分区路径。

2. 从本地导入数据文件:load data local inpath‍

语法:

hive> load data local inpath '/home/a/b/c/xxxx.txt' overwrite into table dest_table partition(dt='xxxxxx');
复制代码

实例:

$ hive -e "load data local inpath '/home/a/b/c/tb_v1.txt'  into table test.tb_test  partition(dt='2020-03-10') "
hive> dfs -du -h hdfs://d/test.db/tb_test/dt=2020-03-10 ;131  hdfs://d/test.db/tb_test/dt=2020-03-10/tb_v1.txt141  hdfs://d/test.db/tb_test/dt=2020-03-10/tb_v1_copy_1.txt -- 重命名的文件hive> select * from tb_test where dt = '2020-03-10';OK123  华为Mate10  31  999.0  20  2020-03-10456  华为Mate30  31  2999.0  30  2020-03-10789  小米5  31  800.0  20  2020-03-101235  小米6  31  900.0  100  2020-03-104562  OPPO Findx  31  3900.0  50  2020-03-10123  华为1010Mate10  31  999.0  20  2020-03-10 -- 如下是第二次复制过来的5条记录456  华为3030Mate30  31  2999.0  30  2020-03-10789  小米5  31  800.0  20  2020-03-101235  小米6  31  900.0  100  2020-03-104562  OPPO Findx  31  3900.0  50  2020-03-10Time taken: 0.051 seconds, Fetched: 10 row(s)hive>
复制代码
  • 目的表要先存在,不然报错。
  • 如果该分区路径和分区信息不存在,会自动新建分区路径和添加分区信息,不用add partition ,能直接查数。大数据培训
  • 这里的本地是指安装Hive的机器。
  • 该命令相当于复制,把源文件复制到指定分区路径下,源文件依然存在。
  • 导入的文件格式要与表的INPUTFORMAT格式相同才能查到数据,比如这里表的INPUTFORMAT是text格式   所以导入也需要txt格式的文件,不然查不到数。
  • 用overwrite时,相当于覆盖,目的路径下已存在的所有文件和子目录全被移动到回收站,然后再复制。
  • 用into时,相当于复制,目的路径下已存在的文件不变,如果存在同名文件,后面复制过来的文件会被重命名成新文件。
  • 最好写上源文件的绝对路径。

3.  从hdfs导入数据文件:load data  inpath ,不用写'local'

语法:

hive> load data inpath 'hdfs:....../part-r-00000001.lzo' overwrite into table dest_table partition(dt='xxxxxx');
复制代码

实例:

hive> load data inpath 'hdfs://d/test.db/tb_test/dt=2020-03-08/tb_v2.txt' overwrite into table test.tb_test2 partition(dt = '2020-03-08');
日志:Loading data to table test.tb_test2 partition (dt=2020-03-08)Partition test.tb_test2{dt=2020-03-08} stats: [numFiles=1, numRows=0, totalSize=131, rawDataSize=0]OKTime taken: 0.767 seconds
hive> dfs -du -h hdfs://d/test.db/tb_test/dt=2020-03-08 ;-- 原数据文件已不存在
hive> dfs -du -h hdfs://d/test.db/tb_test2/dt=2020-03-08 ;131  hdfs://d/test.db/tb_test2/dt=2020-03-08/tb_v2.txthive> select * from test.tb_test2 ;OK123  华为Mate10  31  999.0  20  2020-03-08456  华为Mate30  31  2999.0  30  2020-03-08789  小米5  31  800.0  20  2020-03-081235  小米6  31  900.0  100  2020-03-084562  OPPO Findx  31  3900.0  50  2020-03-08Time taken: 0.407 seconds, Fetched: 5 row(s)
复制代码

这里是把hdfs上的文件移动(剪切)到目的分区的路径下,源文件已不存在。

4. 从hdfs复制数据文件:dfs -cp

语法:

hive> dfs -cp scr_path/dt=xxxx/* dest_path/dt=xxxx/ ;hive> alter table dest_table add partition(dt='xxxx');hive> select * from dest_table where dt = 'xxxx'
复制代码
  • 目的路径要先存在,不然报错'No such file or directory',
  • 需要再手动执行add partition才能查到数据
  • 源路径的'/*'表示路径下的所有文件
  • 这是复制,源文件依然存在。
  • 如果复制的文件较大,则需要等待几分钟或十几分钟,且期间不会有日志输出(distcp有日志输出)。期间输入新的命令也不会有反应。

5.从hdfs移动数据文件:dfs -mv

语法:

hive> dfs -mv scr_path/dt=xxxx/* dest_path/dt=xxxx/ ;hive> alter table dest_table add partition(dt='xxxx');hive> select * from dest_table where dt = 'xxxx';
复制代码
  • 目的路径要先存在,不然报错'No such file or directory',
  • 需要再手动执行add partition才能查到数据。
  • 这是剪切(移动),源文件已不存在。

6. 从hdfs复制数据文件:distcp

$ hadoop distcp  配置参数(-pt -overwrite等)hdfs:......源表1/dt=xxxx/*hdfs:......源表2/dt=xxxx/*hdfs:......目的表/dt=xxxx$ hive -e "select * from 目的表 where dt = 'xxxx'"
复制代码

distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。

7. 从本地上传(复制)数据文件 : dfs -put

语法:

hive> dfs -put 'home/a/b/c/t1.txt' dest_path/dt=xxxx
复制代码

8.从本地上传(复制)数据文件 : dfs -copyFromLocal

hive> dfs -copyFromLocal 'home/a/b/c/t1.txt' dest_path/dt=xxxx
  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值