从一次跑数中浅析hadoop和spark-hive基本操作和优化

文/michaelgbw

最近遇到一个跑数需求

首先我想说之前php做的还是做服务多一点,数据的话我也只是做展示开发的工作,所以这篇文章有什么不妥,错误欢迎大家指正.

其实是最近才开始使用PHP来操作hadoop的,大家可能上来就问号脸了,PHP还能做数据运算??

《从一次跑数中浅析hadoop和spark-hive基本操作和优化》

一开始我也是这个表情,虽然说PHP是 最好的语言,但毕竟他的定位是网络呀???在踏着别人的肩膀(看自己写的框架代码)后发现其实PHP只是在执行shell_exec(),真正起做用的还是sql -> hive -> mapreduce…
别的也不用说了,先看看需求吧(部分是公司内部需求,不做透露)

大概就是有7w的不同的用户qid,然后要求求出每个用户的在一段时间的登录次数和最后的登录时间,截止到当天。先show 出来我们的查询结果:

《从一次跑数中浅析hadoop和spark-hive基本操作和优化》 jieg

对于这么大的数据当然不能直接用mysql跑了~~其实hive和mysql也差不多的,就是稍微有一点语法上的不同。我们一步一步来

首先要把这么多的数据导入一张新表,然后再做关联查询就行了。
文件中的三列为 app_key, qid, is_union 基本用的也就是qid 做关联了查询了

  • hadoop fs -put 先把文件put上去
    这个不用说了,注意下不put上去的文件呢是看不到的,还有就是hadoop put 上去的文件是只有 hadoop fs -ls能看到的,,一般的ls, ll是不行的。
  • 打开hive客户端,建表:
    建表语句:
CREATE TABLE q1(
    app_key string,
    qid string,
        is_union int
)
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE

是不是发现好多和mysql不一样的地方,我们一点一点分析:

  • ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ 的意思是 自定义文件分割符并规定为制表符,
  • STORED AS TEXTFILE,指定文件的存储格式,如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。
  • hive分为内表和外表,hive默认的是内表,外表用create external 来建立

什么是内外表呢?
1在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;
2在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
3 在创建内部表或外部表时加上location 的效果是一样的,只不过表目录的位置不同而已,加上partition用法也一样,只不过表目录下会有分区目录而已,load data local inpath直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中.

  • LOAD DATA LOCAL INPATH ‘/home/hdp-like/q1.txt’ overwrite INTO TABLE q1.

  • 注意 overwrite 是覆盖,比如在load 另一个文件的时候到同一张表时,并不会追加数据而会删掉重写。

  • 这里我们没有给分区,,因为数据量还行(不到100w都不叫大),,分区的话PARTITION (ds); 一般是根据时间分区

  • 其他的相关解释请参考这里

  • 好的开始查询了:

我们的表结构大概是这样:

《从一次跑数中浅析hadoop和spark-hive基本操作和优化》

直接上sql:

SELECT
    login_record.qid,
    COUNT(DISTINCT login_record.dt) AS num,
    MAX(login_record.dt)
FROM
    login_record
JOIN q1 ON q1.qid = login_record.qid
WHERE
    q1.qid IS NOT NULL
AND dt >= '2016-09-01'
GROUP BY
    login_record.qid

sql不是很难的,我们要注意下,基本和mysql 差不多的 standart sql(标准sql),但还有有些需要注意的地方可以参考这个文章,多看看就记住了~

后记

这篇文章只是对一个简单的需求来分析,,真正hadoop操作和mapreduce什么的还是很难的。。和今后我们一起努力,,争取巩固,创新~~

    原文作者:michaelgbw
    原文地址: https://www.jianshu.com/p/d6d9aabaeacb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞