| Yang |


  • Home

  • Tags

  • Archives

深入浅出SQL总结

Posted on 2018-11-20

前言

SQL语法是不区分大小写的,但是命名的时候最好注意规范,语法规定用_来代替空格

我是用《深入浅出SQL》这本书来学习的,网上可以查W3School~

基础语法

语句
  1. CREATE
        creatr database my_db;
        use my_db;
        create table my_info
          (
            my_id int not null auto_increment,
            my_name char(50),
            primary key(my_id)
          )
    
  2. DROP

           drop table my_name           
    
  3. INSERT

           insert into table  my_info(col0,col1...) values('num0','num1'...)
    
  4. SELECT
           select * from  tavle_name where ..  
    

    select 展开讲太多了,最重要的还是灵活运用子查询和各种连接

  5. UPDATE

    1
    2
    3
    4
    5
    6
    update table table_name  
    set col =
    case
    when condition0 then reslut0
    when condition1 then result1
    end;
  6. DELETE

                  delete table_name from where conditon
    
  7. SHOW
                    show databases/tables
    
  8. ALTER
           ```
                          alter table table_name
                           add col...,
                           rename to ...,  
                           change...,
                           modify...,  
                           drop ..
                           ```  
    
    其实就是对表进行修改
关键词

USE:接下来的操作都在某个db中进行
DESC:显示db的结构 /在order by中代表逆序
NULL:不是值,代表未被定义的值
DEFAULT:缺省值
LIKE:查找部分文本字符串 , % :替换符
BETWEEN:在…之间(<=&&>=)
AFTER:把某列放在另一列之后
RIGHT(),LEFT():选出指定数量的字符
select right(‘location’,2) from my_table
ORDER BY(),GROUP BY():按…排序,按…分组
MIN(),MAX(),AVG(),SUM(),COUNT():其中count()作用是返回指定列中的元素
DINSTINCT:查询列中出现过的不重复元素
LIMIT:查询结果的数量 limit m,n #从m开始一共查询n个
T.x -> T.y:在关系表T中,y列函数依赖x列
having:对已经排序的结果进行限制,常和group by等关键词组合使用

  • 数据模式
    • 一对一
    • 一对多
    • 多对多
  • ACID:原子性,一致性,隔离性,持久性
  • RDBMS的规范:
    1NF:数据具有原子性,有主键
    2NF:任何非关键列完全依赖关键列(不存在部分函数依赖)
    3NF:任何非关键列不以来其他非关键列(不存在传递函数依赖)

    字符一般加引号,列名不加

正则表达式

Posted on 2018-11-20

导语

正则表达式的作用:

  • 测试字符串内的模式
  • 替换文本
  • 基于模式匹配从字符串中提取子字符串

语法

正则表达式的各组成部分可以是单个字符、字符集、字符范围或在几个字符之间选择。 也可以是这些组成部分的任意组合。

写完第一步是需要测试的,这里提供一个在线测试网站RegexPlaner

以下是个人常用的(具体的看官方文档.aspx))

  1. 通过在一对分隔符之间放置表达式的各种组成部分,就可以构建正则表达式
           /expression/  
    
  2. 最简单的正则表达式是与搜索字符串相比较的单个普通字符。 例如,单字符正则表达式 A 会始终匹配字母 A,无论其会出现在搜索字符串的哪个位置。
          /A/  
          /a/  
          /123/  
    
  3. 元字符

    • .:匹配除换行符以外的任意字符
    • \w:匹配字母或数字或下划线或汉字
    • \s:匹配任意的空白符
    • \d:匹配任意数字
    • \b:匹配单词的开始和结束
    • ^:字符串的开始
    • ¥:字符串的结束
    • 当然如果你字符串中本来就有这些符号,就可以使用\来进行转义.,如*就应该写成
      E.G:
      \ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w),最后是单词结束处(\b)。
      \d+匹配1个或更多连续的数字。这里的+是和类似的元字符,不同的是匹配重复任意次(可能是0次),而+则匹配重复1次或更多次。
      元字符^(和数字6在同一个键位上的符号)和匹配结尾。比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$
  4. 限定符

    • *:匹配零次或多次前面的字符或子表达式
    • +: 匹配一次或多次前面的字符或子表达式
    • ?:匹配零次或一次
    • {n}: 匹配N次
    • {n,}: 匹配N或更多次
    • {n,m}: 匹配N到M次
      E.G: Linux\d+:匹配Linux之后跟的一个或多个数字
  5. 字符类
    如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。

    • [0-9]:匹配任意一个数字,类似于\d
    • [a-z]&[A-Z]:匹配任意一个小写字母&大写字母
      E.G:
      /(?0\d{2}[) -]?\d{8}:就可以匹配(010)88886666,或022-22334455,或02912345678之类的。首先使用\对(进行转义,然后匹配一个或没有0,再接着两个数字,[)-]则匹配一次) or -这两个符号,最后再加上\d{8}匹配八位数字
  6. 反义
    有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义。

    • \W:匹配任意不是字母,数字,下划线,汉字的字符
    • \S:匹配任意不是空白符的字符
      …
    • z:匹配除了z以外的任意字符
  7. 分支条件 .
    正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。
    E.G:

    • 0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)
    • \d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
  8. 分组
    前面我们看到单个字符数字等可以重复,其实多个也是可以的,这就需要使用分组啦
    E.G:
    ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):匹配IP地址,自己领会~

了解用户画像

Posted on 2018-11-19

为什么

  • 构建具体蓝本,有助于产品团队脱离自身喜好和整个团队目标的一致性
  • 精准营销

怎么做

构建用户画像的核心是打标签,通过高度精炼的标签去描述一个用户,如年龄性别地域偏好等。

  1. 明确构建用户画像的目的
  2. 根据目的,明确需要收集什么数据,进行数据的采集(宏观,微观等)
  3. 进行数据分析与建模

    通过定性与定量相结合的方式进行数据建模。定性的方法,表现为对产品、行为、用户个体的性质和特征的概括,从而形成对应的产品标签、行为标签以及用户标签;定量的方法,是在定性的基础上,给每个标签加上特定的权重,最后通过计算得出总标签权重,从而形成完整的用户模型。

标签权重模型: 待续

  • 原始数据
  • 事实标签
  • 模型标签
  • 预测标签
    基于TF-IDF算法的权重分类:一个词语的重要性随着他在该文章中出现的次数成正比,随着它在整个文档集中出现的次数成反比。
    假设w(P , T)表示一个标签T被用于标记用户P的次数,TF(P,T)表示这个标记次数在用户P所有标签中所占的比重:
    1
    2
    IDF(P , T)表示标签T在全部标签中的稀缺程度,如果标签次数出现越少,并同时标注某一个用户,则代表该标签与用户联系很紧密。
    ```IDF(P,T) = LOG( 全部用户的全部标签之和 / 所有打T标签的用户之和)

最后根据TFIDF即可得到该用户该标签的权重值
实际业务上需要根据具体情况做出改变:
用户标签权重 = 行为类型权重 x 衰减时间 x TF-IDF标签权重 x 行为次数
*基于相关系数矩阵的权重归类
:相关系数矩阵

  1. 进行数据维度分解和列举
    根据相关性原则,进一步筛选和构建用户画像相关的数据维度,避免无用数据干扰分析的过程,用户数据维度可以分为以下几个特征:
  • 用户自然特征:性别、年龄、地域、教育水平、出生日期、星座等
  • 用户兴趣特征:兴趣爱好、偏爱的应用、品牌偏好
  • 用户社会特征:婚姻状况、家庭状况、社会地位
  • 用户消费特征:收入、购买力、购买渠道、购买频次

如何应用用户画像

  1. 根据用户画像列举用户场景及需求
  2. 应用用户画像进行产品设计决策

注意事项(Persona原则)

  • P - 基本性 指是否基于对真实用户的访谈
  • E -同理性(不理解)指指用户角色中包含姓名、照片和产品相关的描述,该用户角色是否引同理心;
  • R -真实性指用户画像是否看起来真实,特别是对于每天和用户打交道的人来说
  • O - 目标性指该用户是否包含与产品相关的高层次目标,是否包含关键词来描述该目标
  • N -数量性指数量要足够少,以便使设计团队记住每一个角色的姓名
  • A -应用性指用户画像是否实用,能够辅助设计决策

一个产品大概需要4-8个用户画像,最好设置优先级,当产品特别大的时候,可以考虑针对不同模块建立用户画像

相关工作

  1. 构建用户画像文档
  2. 展示用户画像
  3. 完善用户画像

K-means简述

Posted on 2018-11-19

简介

K-means算法是聚类算法中最简单的一种,但是里面包含的思想却不一般。K-means属于无监督学习,以往的回归、朴素贝叶斯、SVM等都是有类别标签y的,也就是说样例中已经给出了样例的分类。而聚类的样本中却没有给定y,只有特征x,假设宇宙星空中的点集可以表现成(X,Y,Z),聚类的目的就是为X找到潜在的Y,并将同类别的Y放在一起

算法描述

算法具体过程

  1. 随机选取K个点作为质点
  2. 对于每一个样本点X,将其归类为距离质心点最近的类别
  3. 更新每个类别的质心点为隶属于该类别所有点的平均值
  4. 重复步骤二三,直至质心不变或变化很小

聚类效果

问题

1.K-means算法的第一个问题就是如何保证收敛,因为前面算法的结束条件就是收敛,下面我们来描述一下:
定义畸变函数J(c,u) ,表示每个样本点到其质心的距离平方和
J函数
此时我们的重点是研究如何研究是J函数最小,假设J函数没有函数达到最小值,那样我们就可以先固定每个类的质心,调整每个样例所属的类别来让J函数减小,或者固定类别,调整质心也可以使J减小。这两个过程就是内循环中使J函数减小的过程,当J函数最小时,u,c也同时收敛。

由于畸变函数J是非凸函数,意味着我们不能保证取得的最小值是全局最小值,也就是说k-means对质心初始位置的选取比较感冒,但一般情况下k-means达到的局部最优已经满足需求。但如果你怕陷入局部最优,那么可以选取不同的初始值跑多遍k-means,然后取其中最小的J对应的u

凸优化有个非常重要的定理,即任何局部最优解即为全局最优解。

EM思想:这里只是指出EM的思想,E步就是估计隐含类别y的期望值,M步调整其他参数使得在给定类别y的情况下,极大似然估计P(x,y)能够达到极大值。然后在其他参数确定的情况下,重新估计y,周而复始,直至收敛。其实总体还是一个迭代优化的过程。

缺点:K-means算法有两个缺点,第一、该方法对K个质心初始位置的选择比较感冒,一般而言k-means算法只能达到局部最优,因此K个质心初始位置不同,则达到的局部最优解也会不一样;第二、K值一般要根据先验知识,事先给定。

初识Git

Posted on 2018-11-19

参考

  • Git背景
  • Git基础

Git仓库

  • workspace :工作区
  • index / stage : 暂存区
  • repository : 本地仓库
  • remote : 远程仓库

仓库图解

文件状态 :对于任何一个文件,Git内部只有三个状态 “ 已提交(committed),已修改(modified),已暂存(staged)”,已提交表示文件已经被安全地保存在本地数据库中,已修改表示修改了某个文件,但是还没有提交保存,已暂存表示已经修改的文件放在下次提交时要保存的清单中

文件图解

Git常用命令

to be added

位基础

Posted on 2018-11-17

基本换算关系

1 bit 二进制数据
1 byte = 8 bit
1 字母 = 1 byte = 8 bit
1 汉字 = 2 字母 = 16bit
bit : 位 ( 0 | 1 )

标点符号(有坑…)

A : 汉族输入状态下,默认为全角输入方式;
B : 英文输入状态下,默认为半角输入方式;

C : 全角输入方式下,标点符号占2字节;
D : 半角输入方式下,标点符号占1字节;

我的Hive学习之旅

Posted on 2018-11-17

row number

作用 : 返回这个Partition下的当前Row号,根据排序字段生成,无重复。

语法 :row_number() over (partition by 字段a order by 计算项b desc ) rank

1
2
3
4
select seasonid, episodeid , 
row_number() over(partition by seasonid order by episodeid asc) as rank
from tutor.dw_season_live_information a
where dt = date_sub(current_date,1) limit 100

内置rank分析函数区别 :

  • row_number:不管排名是否有相同的,都按照顺序1,2,3…..n
  • rank:排名相同的名次一样,同一排名有几个,后面排名就会跳过几次
  • dense_rank:排名相同的名次一样,且后面名次不跳跃

with cube & grouping sets & rollup

主要用于不能用简单group by语句处理需求的情况

  • grouping sets : 其后面跟括号里指定了零个或多个分组变量的聚合,然后产生这个维度下的聚合结果,再将每个结果UNION到一起,其实也就是相当于

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select a,sum(xx) form table1 … group  by a 
    union
    select b,sum(xx) form table1 … group by b
    union
    select sum(xx) form table1 … group by a,b
    union
    ...
    这个意思

    用法:
    select ga, gb, sum(val) from table
    group by ga, gb
    GROUPING SETS ((ga), (gb), ());
  • with cube : 对变量进行有/无的组合,如果有三个对象,就会产生2^3 = 8种聚合情况

    1
    2
    3
    4
    eg :
    cube (a,b,c)
    equal
    grouping sets( (a,b,c), (a,b), (a,c), (a),(b,c), (b), (c), () )
  • rollup : 是cube的子集,以最左侧的维度为主,从该维度进行层级聚合

    1
    2
    3
    4
    eg  : 
    rollup(a,b,c)
    equal
    grouping sets( (a,b,c),(a,b),(a),() )

regexp_extract

字符串正则表达式解析函数

1
2
3
4
5
6
7
eg : 
select regexp_extract( 'yfd-mkt-0207juzhanYY05-grp-123', 'yfd-mkt-([^\\-]+)-.*', 1) as keyfrom_type; — res : 0207juzhanYY05

0 : 表示把整个正则表达式对应的结果全部返回
1 :表示返回表达式中第一个()对应的结果
依次类推...
相关函数 : regexp_replace()

get_json_object

作用 : 从复杂json对象中提取元素

1
2
3
‘$’表示对Root对象

eg : get_json_object(t.info,'$.xx')

nvl

NVL函数的格式如下:NVL(expr1,expr2)
含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。

时间处理 :

一种思路 : 可以把时间转化为一个整数,经过处理之后,再转化为日期格式。

常见hive时间转换函数

  • from_unixtime : 日期函数UNIX时间戳转日期函数: from_unixtime语法: from_unixtime(bigint unixtime[, string format]),可以是识别到月
  • unix_timestamp(string date, string pattern) : 指定格式日期转UNIX时间戳函数,可以识别到月

    1
    2
    3
    4
    5
    6
    hive>   select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss');
    1323234063
    hive> select unix_timestamp('2011-12-07 13:05','yyyy-MM-dd HH:mm');
    1323234300
    hive> select unix_timestamp('2011-12','yyyy-MM');
    1322668800
  • date_format :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    hive> select date_format('2015-04-08', 'y');
    2015
    hive> select date_format('2015-04-08', 'yyyy');
    2015
    hive> select date_format('2015-04-08', 'yyyy-MM');
    2015-04
    hive> select date_format('2015-04-08 10:10:01', 'yyyy-MM');
    2015-04
    hive> select date_format('2015-04-08', 'yyyy-MM-dd');
    2015-04-08
  • to_date

    1
    2
    3
    4
    5
    6
    hive>   select to_date('2011-12-08 10:03:01');
    2011-12-08
    hive> select to_date('2011-12-08');
    2011-12-08
    hive> select to_date('2011-12');
    NULL
  • date_sub | date_add 这个用法还是非常显而易见的

读菊与刀

Posted on 2018-11-15

2018.11.13夜

今天读完了《菊与刀》这本书,先Mark一下个人读完还可以想起来的点。

  • 日本自古以来形成了一套等级体系和其独有的道德体系,追求每个人都可以在自己的位置上生活。
  • 日本人对成年人极度要求自律,强调精神战胜肉体,不排斥肉体的享受,但是遇到重大事件肉体必须给精神让步。
  • 日本人大多对生活中的小事很敏感,对’恩’这个东西很在意。日本家庭关系里恩也是贯穿始终->孝>爱情。
  • 日本的道义包罗万象。
  • 日本人很在意别人是怎么看他们的,一但受到侮辱则需要复仇。(另类的复仇->重建家园)
  • 日本的天皇的重要作用是提升国民凝聚力
  • 日本人可以很快地抛弃之前的路线,转而立马走上新的。但是也对传统有着疯狂坚持。
  • [x] 道义
  • [x] 忠
  • [x] 诚
  • [x] 自重
  • [x] 恩

延伸:
日本和西德在战后无需关心军备,十年左右的时间打下了完备健康的经济基础。
大概是日本和德国的产品和文化吸引了我,对这两个国家特别感兴趣。失败了就重建且迎头赶上,也不失为一种浪漫呀

后面找一找关于西德的书,还有《四十七浪人物语》看一看。

Linux_command.md

Posted on 2018-11-15

Linux是程序猿的必修课,所以掌握一下怎么和机器对话吧:)

ls

缺省下ls会打印当前目录下的文件清单,若指定其他目录则会显示指定目录下的文件及文件清单。其可以查看目录,文件权限等信息

  1. 命令格式 : ls [选项][目录名]
  2. 常用参数 :

       - a : -all,列出目录下所有文件,包括.开头的文件
       - h : 列出文件大小
       - t : 以文件修改时间排序
    

    -l : 列出文件的所有信息,包括文件权限,文件所有者,文件大小

mv

move的缩写,可以用来移动文件或者重命名文件,是Linux下常用的命令

  1. 命令格式 : mv [选项] 源文件或目录 目标文件或目录
  2. 常用参数 :
    根据目标文件或者参数来自动悬着移动或者是重命名文件,如果是目录,则移动,如果是文件,则重命名
    - b : 如果需要覆盖文件,则覆盖前先备份
    - f : 强制覆盖
    - t : 适用于移动多个源文件到一个目录
    

find

在目录结构中搜索文件,并执行指定的操作。其功能十分强大,只要你具有相应的权限,基本都是可以使用的。

  1. 命令格式 : find pathname -options [-print -exec -ok …]
  2. 命令参数 :

        - pathname : find命令所查找的目录路径
        - print : find命令将匹配的文件输出到标准输出
        - exec : find命令对匹配的文件执行该参数所给出的shell命令。
    

    3.命令选项 :

        - name : 按照文件名查找文件
        - user : 按照文件主属性来查找文件
        - cmin : 查找系统最后N分钟被改变的文件状态 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  pipe_warehouse git:(master) find tutor/ -name odsTutorMarketStudentCpa.py
tutor//odsTutorMarketStudentCpa/odsTutorMarketStudentCpa.py
➜ code cd test_code
➜ test_code ls
test_para_pass.sh
➜ test_code vim test.txt
➜ test_code ls
test.txt test_para_pass.sh
➜ test_code cd ~/Desktop/code/
➜ code pwd
/Users/zhangyangfenbi.com/Desktop/code
➜ code find test_code -name test.txt
test_code/test.txt
➜ code find test_code -name test.txt | xargs cat

hello zhangyang

pwd

查看当前目录的完整路径

  1. 命令格式 : pwd [选项]
  2. 常用参数 : 一般情况下不带任何参数,但是如果目录是链接的时候,格式: pwd -P 显示出实际路径,而非使用的Link路径。

mkdir

在指定位置创建指定名称的文件夹或者目录,要求创建者对所创建的文件夹的父文件夹具有写权限,并且创建的文件夹不可以和父文件夹重名。

  1. 命令格式 : mkdir [选项] 目录
  2. 命令参数 :
    -m : —mode = 模式,设定权限<模式>,类似于chmod
      eg : mkdir -m 777 zy_test
    
    -p : 递归创建多个目录

大型拖现场

  • date : 2018-05-28
  • date : 2018-05-29
  • date : 2018-05-30

感觉自己是个呆瓜…

  • date : 2018-05-31

出去玩三天,暂停更新。

  • date : 2018-06-04
  • date : 2018-06-05

呆瓜如我…

  • date : 2018-06-06

man

Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件、编程帮助等信息

  1. 命令格式 : man (选项)(参数)
    2.常用参数 :
       -f : 等价于whatis指令,显示给定关键词的剪短描述信息
    

Google一下,man一下, wiki一下,实在不行再问人。勿要轻易打扰他人。

which

查看可执行文件的位置

  1. 命令格式 : which 可执行文件的名称
    1
    2
    3
    4
    5
    6
    ➜  code which python3
    /usr/local/bin/python3
    ➜ code which java
    /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/java
    ➜ code which mysql
    /usr/local/mysql/bin/mysql

Updated 换种版式,上面那样写不够流畅(2018-10-25)

du


命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。

语法 :du -option -file

选项

  • -a或-all 显示目录中个别文件的大小。
  • -b或-bytes 显示目录或文件大小时,以byte为单位。
  • -c或—total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
  • -k或—kilobytes 以KB(1024bytes)为单位输出。
  • -m或—megabytes 以MB为单位输出。
  • -s或—summarize 仅显示总计,只列出最后加总的值。
  • -h或—human-readable 以K,M,G为单位,提高信息的可读性。
  • -x或—one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
  • -L<符号链接>或—dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
  • -S或—separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
  • -X<文件>或—exclude-from=<文件> 在<文件>指定目录或文件。
  • —exclude=<目录或文件> 略过指定的目录或文件。
  • -D或—dereference-args 显示指定符号链接的源文件大小。
  • -H或—si 与-h参数相同,但是K,M,G是以1000为换算单位。
  • -l或—count-links 重复计算硬件链接的文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ➜  Movies ls
    [王牌保镖.保镖救杀手][BluRay-720P.MKV][2.96GB][中英字幕] 触不可及-1280高清.mp4
    ➜ Movies du
    6243576 ./[王牌保镖.保镖救杀手][BluRay-720P.MKV][2.96GB][中英字幕]
    2425128 ./触不可及-1280高清.mp4
    8668720 .
    ➜ Movies du -m
    3049 ./[王牌保镖.保镖救杀手][BluRay-720P.MKV][2.96GB][中英字幕]
    1185 ./触不可及-1280高清.mp4
    4233 .
    ➜ Movies du -s -m
    4233 .
    ➜ Movies du -h
    3.0G ./[王牌保镖.保镖救杀手][BluRay-720P.MKV][2.96GB][中英字幕]
    1.2G ./触不可及-1280高清.mp4
    4.1G .

df


命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息

语法:df -option -file
选项

  • -a或—all:包含全部的文件系统;
  • —block-size=<区块大小>:以指定的区块大小来显示区块数目;
  • -h或—human-readable:以可读性较高的方式来显示信息;
  • -H或—si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
  • -i或—inodes:显示inode的信息;
  • -k或—kilobytes:指定区块大小为1024字节;
  • -l或—local:仅显示本地端的文件系统;
  • -m或—megabytes:指定区块大小为1048576字节;
  • —no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
  • -P或—portability:使用POSIX的输出格式;
  • —sync:在取得磁盘使用信息前,先执行sync指令;
  • -t<文件系统类型>或—type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
  • -T或—print-type:显示文件系统的类型;
  • -x<文件系统类型>或—exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
  • —help:显示帮助;
  • —version:显示版本信息。

nl


nl在Linux中用来计算文件中行号。nl可以将输出的文件内容自动的加上行号,其默认结果与cat -n有点不一样,nl可以将行号做比较多的显示设计

语法:nl -option -file
选项

  • -b : 指定行号的指定方式
    • -b a : 表示不论是否为空行,也同样列出行号
    • -b t : 如果有空行,空的那一行不要列出行号
  • -n : 列出行号表示的方法
    • -n ln : 行号在屏幕最左方显示
    • -n rn : 行号在屏幕最右方显示,且不加0
    • -n rz : 行号在屏幕最右方显示,且加0

scp


scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。(优点:非常不占用系统资源)
语法: scp -option source_dir tar_dir

  • -r 递归复制整个目录
    明天问问运维大哥为啥从f04上面复制不了文件到本机。。。。

Hadoop Sqoop

Posted on 2018-11-04

Sqoop是什么?

Sqoop是Apache下用于关系数据库(RDBMS)和HDFS互相导数据的一个工具。

使用

2.1 命令说明

查看Sqoop命令说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sqoop help
usage: sqoop COMMAND [ARGS]

Available commands:
codegen Generate code to interact with database records
create-hive-table Import a table definition into Hive
eval Evaluate a SQL statement and display the results
export Export an HDFS directory to a database table
help List available commands
import Import a table from a database to HDFS
import-all-tables Import tables from a database to HDFS
list-databases List available databases on a server
list-tables List available tables in a database
version Display version information

See 'sqoop help COMMAND' for information on a specific command.

也可以查看某一个命令的说明

1
$sqoop import --help

Sqoop import demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 直接写入参数
sqoop import
--connect jdbc:mysql://192.168.56.121:3306/metastore
--username
hiveuser
--password
redhat
--table
tutor_abc

# 也可以以文件的方式传入
$sqoop --option-file
~/Desktop/config.txt -- table tutor_abc

$cat ~/Desktop/config.txt

import
--connect
jdbc:mysql://192.168.56.121:3306/metastore
--username
hiveuser
--password
redhat

2.2 导入数据到HDFS

话不多说,直接看看生产环境的参数吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import-all-tables
--connect
jdbc:mysql://mysql-myhost:3306/tutor_banner?useUnicode=true&characterEncoding=UTF-8
--username
zhangyang
--password
zhangyangisahandsome
--warehouse-dir
/sqoop/tutor_banner
--mysql-delimiters
--m
2
--direct
--
--default-character-set=utf8

从以上代码可以看到,除了--connect,--username,--password这几个基本参数以外,还有--warehouse-dir|
--mysql-delimiters|-m|--direct|--default-character-set=utf8这几个参数,我们就依次来看看是意思

  • --connect,--username,--password : 这几个是为Sqoop连接RDBMS传入的参数,知道就好。
  • --warehouse-dir : 与 --target-dir 不能同时使用,指定数据导入的存放目录,适用于hdfs导入,不适合导入hive目录
  • --target-dir : 指定的HDFS目录
  • --mysql-delimiters :
  • -m : 启动N个map来并行导入数据,默认是4个,最好不要将数字设置为高于集群的节点数
  • --direct : 直接导入模式,使用的是关系数据库自带的导入导出工具。官网上这是最快的方式
  • --mysql-delimiters : Mysql默认的分隔符设置,字段之间以,隔开,行之间以换行\n隔开,默认转义符号是\,字段值以单引号’包含起来。
  • --default-character-set=utf-8 : 顾名思义

code demo

1
2
3
4
5
6
7
8
#指定从TBLS里面导入tal_id,create_time两列,且tab_id满足>1的条件,导入到/user/hive/result下
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --columns "tbl_id,create_time" --where "tbl_id > 1" --target-dir /user/hive/result

#使用SQL语句查询:1)需要指定\$CONDITIONS;2)需要指定--split-by,以分隔工作量;3)必须指定--target-dir目录
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --query 'SELECT * from TBLS where tab_id <1000 and $CONDITIONS ' --split-by tbl_id -m 2 --target-dir /user/hive/result

#指定文件输出格式
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" --delete-target-dir --target-dir /user/hive/result

2.3 创建Hive表

生成与关系数据库相对应的Hive表

1
2
3
4
5
6
$sqoop --create-hive-table --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS 

#参数:
--hive-overwrite : 覆盖掉在hive表中已经存在的数据
--create-hive-table : 默认是false,如果目标表已经存在了,那么创建任务会失败
--hive-table : 后面接要创建的hive表

2.4 导入数据到Hive

执行下面的命令会将 mysql 中的数据导入到 hdfs 中,然后创建一个hive 表,最后再将 hdfs 上的文件移动到 hive 表的目录下面。

1
2
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" 
--hive-import --hive-overwrite --create-hive-table --hive-table dw_srclog.TBLS --delete-target-dir

Tips : Sqoop 默认地导入空值(NULL)为 null 字符串,而 hive 使用 \N 去标识空值(NULL),故你在 import 或者 export 时候,需要做相应的处理。

1
2
3
4
5
# 在 import 时,使用如下命令
$ sqoop import ... --null-string '\\N' --null-non-string '\\N'

#在导出时,使用下面命令
$ sqoop import ... --input-null-string '' --input-null-non-string ''

2.5 增量导入

参数 说明
--check-column (col) 用来作为判断的列名,如id
--incremental (mode) append:追加,比如对大于last-value指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加last-value指定的日期之后的记录
--last-value (value) 指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值

2.6 合并HDFS文件

将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中

1
2
#将/test/p1/person与/test/p2/person合并,放到/test/merged这个目录下,其中优先保留–new-data参数后的数据
sqoop merge –new-data /test/p1/person –onto /test/p2/person –target-dir /test/merged –jar-file /opt/data/sqoop/person/Person.jar –class-name Person –merge-key id

参考文章

  • Sqoop User Guide
  • Ali Sqoop

感恩作者JavaChen:)
文章内容大部分来自Sqoop导入关系数据库到Hive

1…1112
zhangyang

zhangyang

120 posts
39 tags
© 2022 zhangyang
Powered by Hexo
|
Theme — NexT.Mist v5.1.4