load data

1.LOAD 操作只是单纯的复制或者移动操作,将数据文件移动到 Hive 表对应的位置。
2.LOCAL 关键字
如果指定了 LOCAL, LOAD 命令会去查找本地文件系统中的 filepath。
如果没有指定 LOCAL 关键字,则根据 inpath 中的 uri 查找文件
注意:uri 是指 hdfs 上的路径,分简单模式和完整模式两种,
例如:
简单模式:/user/hive/project/data1
完整模式:hdfs://namenode_host:9000/user/hive/project/data13.filepath:
相对路径,例如:project/data1
绝对路径,例如:/user/home/project/data1
包含模式的完整 URI,列如:hdfs://namenode_host:9000/user/home/project/data1
注意:inpath 子句中的文件路径下,不能再有文件夹。
4.overwrite 关键字
如果使用了 OVERWRITE 关键字,则目标表(或者分区)中的内容会被删除,然后再将filepath 指向的文件/目录中的内容添加到表/分区中。
如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,
那么现有的文件会被新文件所替代。

1.加载本地相对路径数据
load data local inpath ‘/student.txt’ into table student;
2.加载绝对路径数据
load data local inpath ‘/hadoop/data/student.txt’ into table student;
3.加载绝对路径数据
load data local inpath ‘hdfs://192.168.10.201:9000/hadoop/data/student.txt’ into table student;
4.overwrite 关键字使用
load data local inpath ‘/student.txt’ overwrite into table student;

差集使用左右连接

Hive Join 查询

Hive 支持等值连接(equality join)、外连接(outer join)和(left/right join)。Hive 不支持非等值的连接,因为非等值连接非常难转化到 map/reduce 任务。另外,Hive 支持多于 2 个表的连接。
写查询时要注意以下几点:
1. 只支持等值链接,支持 and,不支持 or
例如:
SELECT a. FROM a JOIN b ON (a.id = b.id)
SELECT a.
FROM a JOIN b ON (a.id = b.id AND a.department = b.department)
是正确的;
然而:SELECT a.* FROM a JOIN b ON (a.id>b.id)是错误的。
2.可以 join 多于 2 个表
例如:SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
如果 join 中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务,例如:
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
被转化为单个 map/reduce 任务,因为 join 中只使用了 b.key1 作为 join key。
例如:SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2),而这一 join 被转化为 2 个 map/reduce 任务。因为 b.key1 用于第一次 join 条件,而b.key2 用于第二次 join。
3.Join 时,每次 map/reduce 任务的逻辑
reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统。这一实现有助于在 reduce 端减少内存的使用量。实践中,应该把最大的那个表写在最后(否则会因为缓存浪费大量内存)。例如:
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
所有表都使用同一个 join key(使用 1 次 map/reduce 任务计算)。Reduce 端会缓存 a 表和 b 表的记录,然后每次取得一个 c 表的记录就计算一次 join 结果,类似的还有:
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
这里用了 2 次 map/reduce 任务:
第一次缓存 a 表,用 b 表序列化;
第二次缓存第一次 map/reduce 任务的结果,然后用 c 表序列化。
4.HiveJoin 分三种:inner join, outer join, semi join
其中:outer join 包括 left join,right join 和 full outer join,主要用来处理 join 中空记录的情况

作者:爱Rap篮球写代码的蔡徐
链接:https://juejin.cn/post/6844904005756272654
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

数据倾斜

近来,求职数据分析师常被问到:数据倾斜如何调优?对于经常使用HQL处理大数据的同学,这个问题并不陌生:任务进度长时间维持在99%,而查看监控页面,发现只有某几个reduce子任务尚未完成,十分诡异。
要解决数据倾斜这个问题,我们需要先了解下数据倾斜产生的原因是什么?一般由于以下三个操作:count(distinct *), group by , join引起的,导致某个reducer处理的数据过多引起处理时间非常耗时。

什么是数据倾斜(Data Skew)?
数据倾斜是指在原本应该并行处理的数据集中,某一部分的数据显著多于其它部分,从而使得该部分数据的处理速度成为整个数据集处理的瓶颈。
假设数据分布不均匀,某个key对应几十万条数据,其他key对应几百条或几十条数据,那么在处理数据的时候,大量相同的key会被分配(partition)到同一个分区里,造成“一个人累死,其他人闲死“的情况,具体表现在:有些任务很快就处理完了,而有些任务则迟迟未能处理完,导致整体任务最终耗时过长甚至是无法完成。
数据倾斜分为map端倾斜和reduce端倾斜。

数据的key 的分化严重不均,造成一部分数据很多,一部分数据很少的局面。

因此解决调优的方式可以从3方面入手尝试:
1. 数据层面
有损方法:找到异常数据,符合业务场景的前提下,直接过滤
无损方法:对分布不均匀的数据,先对key做一层hash,先将数据打散增大并行度,再汇聚

2. 代码方面:
使用sum() group by 替代coun(distinct )
显式使用mapjoin:/+mapjoin(x)/
避免多表同时join,使用临时中间表过渡

3. 参数方面:
负载均衡:hive.groupby.skewindata=true
map端聚合:hive.map.aggr = true
增加reduce 个数: hive.exec.reducer.max = / mapred.reduce.tasks =
采用压缩:hive.exec.compress.output = true /mapredu.output.compress = true (这个方式不完全是解决数据倾斜问题,减少IO读写和网络传输,提高效率)
1人点赞