zoukankan      html  css  js  c++  java
  • Hive的Serde,Server2,函数(四)

    Hive Serde


    Hive Serde用来做序列化和反序列化,构建在数据存储和执行引擎之间,对两者实现解耦。

     

    应用场景:

    1. hive主要用来存储结构化数据,如果结构化数据存储的格式嵌套比较复杂的时候,可以使用serde的方式,利用正则表达式匹配的方法来读取数据,例如,表字段如下:id,name,map<string,array<map<string,string>>>

    2. 当读取数据的时候,数据的某些特殊格式不希望显示在数据中,如:192.168.57.4 - - [29/Feb/2019:18:14:35 +0800] "GET /bg-upper.png HTTP/1.1" 304 - 不希望数据显示的时候包含[]或者"",此时可以考虑使用serde的方式

     

    应用案例:

    1. 数据文件

      192.168.57.4 - - [29/Feb/2019:18:14:35 +0800] "GET /bg-upper.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:35 +0800] "GET /bg-nav.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:35 +0800] "GET /asf-logo.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:35 +0800] "GET /bg-button.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:35 +0800] "GET /bg-middle.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET / HTTP/1.1" 200 11217
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET / HTTP/1.1" 200 11217
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /tomcat.css HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /tomcat.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /asf-logo.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /bg-middle.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /bg-button.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /bg-nav.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /bg-upper.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET / HTTP/1.1" 200 11217
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /tomcat.css HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /tomcat.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET / HTTP/1.1" 200 11217
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /tomcat.css HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /tomcat.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /bg-button.png HTTP/1.1" 304 -
      192.168.57.4 - - [29/Feb/2019:18:14:36 +0800] "GET /bg-upper.png HTTP/1.1" 304 -

       

    2. 基本操作,使用正则方式
      --创建表
          CREATE TABLE logtbl (
              host STRING,
              identity STRING,
              t_user STRING,
              time STRING,
              request STRING,
              referer STRING,
              agent STRING)
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
              "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \[(.*)\] "(.*)" (-|[0-9]*) (-|[0-9]*)"
            )
        STORED AS TEXTFILE;
      --加载数据
          load data local inpath '/root/data/log' into table logtbl;
      --查询操作
          select * from logtbl;
      --数据显示如下(不包含[]和"
      192.168.57.4    -    -    29/Feb/2019:18:14:35 +0800    GET /bg-upper.png HTTP/1.1    304    -
      192.168.57.4    -    -    29/Feb/2019:18:14:35 +0800    GET /bg-nav.png HTTP/1.1    304    -
      192.168.57.4    -    -    29/Feb/2019:18:14:35 +0800    GET /asf-logo.png HTTP/1.1    304    -
      192.168.57.4    -    -    29/Feb/2019:18:14:35 +0800    GET /bg-button.png HTTP/1.1    304    -
      192.168.57.4    -    -    29/Feb/2019:18:14:35 +0800    GET /bg-middle.png HTTP/1.1    304    -

    Hive-Server2


    基本概念介绍(jdbc方式连接,只能使用Hive-Server2)

    1. HiveServer2基本介绍 HiveServer2是一个服务接口,能够允许远程的客户端去执行SQL请求且得到检索结果。

    2. Beeline HiveServer2提供了一种新的命令行接口,可以提交执行SQL语句。

    3. 其实Hive-Server2和Hive一样,只是为了给第三方人员提供方便使用,既:Hive给数据分析师用,Hive-Server2给开发人员用

    4. 之所用叫Hive-Server2,不叫Hive-Server,是因为在hadoop 2.x版本被抛弃了,升级到了Hive-Server2

    5. hiveServer2 可以连接多个session, 并且记录每个session的ip以及sql操作语句

    hiveserver2的搭建使用

    • 配置超级用户,因为启动 beeline 需要超级用户,或者伪装,所以加入如下配置、不需要关闭hdfs集群

      --在hdfs集群的core-site.xml文件中添加如下配置文件(将root设置为超级管理员)
          <property>
              <name>hadoop.proxyuser.root.groups</name>    
              <value>*</value>
          </property>
          <property>
              <name>hadoop.proxyuser.root.hosts</name>    
              <value>*</value>
          </property>
          
       分发
      scp core-site.xml  node02:`pwd`
      scp core-site.xml  node03:`pwd`
      scp core-site.xml  node04:`pwd`
       
       
      --配置完成之后重新启动集群,或者在namenode的节点上执行如下命令
      node01:
          hdfs dfsadmin -fs hdfs://node01:8020 -refreshSuperUserGroupsConfiguration
      node02:
          hdfs dfsadmin -fs hdfs://node02:8020 -refreshSuperUserGroupsConfiguration

       注意: 若需要更换root是启动hdfs的用户、* 是你自己启动hiveserver2的用户,这里的配置指: 需要把*(登录hiveserver2任何用户)伪装成root

       

    • node03:(ss -nal 可以查看端口,和netstat一样, 服务端口是10000,客户端是10002)
    • node04
      • 启动:hive --service hiveserver2  
    • node04(启动beeline)
      1. 登录方式一:

        1. beeline

        2. !connect jdbc:hive2://node03:10000/default root 123(用户名和密码可以不写)

      2. 登录方式二:beeline -u jdbc:hive2://node03:10000/default(只要能访问到10000端口,就可以登录)

      3. 测试:

        1. show tables;

        2. select * from psn;

      4. 退出: !close

    • 当用随意账号登录,出现没有权限访问hdfs中的 /tmp目录
    • 解决办法:hdfs dfs -chmod 777 /tmp
    1. 运算符类型说明
      A = B 所有原始类型 如果A与B相等,返回TRUE,否则返回FALSE
      A == B 失败,因为无效的语法。 SQL使用”=”,不使用”==”。
      A <> B 所有原始类型 如果A不等于B返回TRUE,否则返回FALSE。如果A或B值为”NULL”,结果返回”NULL”。
      A < B 所有原始类型 如果A小于B返回TRUE,否则返回FALSE。如果A或B值为”NULL”,结果返回”NULL”。
      A <= B 所有原始类型 如果A小于等于B返回TRUE,否则返回FALSE。如果A或B值为”NULL”,结果返回”NULL”。
      A > B 所有原始类型 如果A大于B返回TRUE,否则返回FALSE。如果A或B值为”NULL”,结果返回”NULL”。
      A >= B 所有原始类型 如果A大于等于B返回TRUE,否则返回FALSE。如果A或B值为”NULL”,结果返回”NULL”。
      A IS NULL 所有类型 如果A值为”NULL”,返回TRUE,否则返回FALSE
      A IS NOT NULL 所有类型 如果A值不为”NULL”,返回TRUE,否则返回FALSE
      A LIKE B 字符串 如 果A或B值为”NULL”,结果返回”NULL”。字符串A与B通过sql进行匹配,如果相符返回TRUE,不符返回FALSE。B字符串中 的””代表任一字符,”%”则代表多个任意字符。例如: (‘foobar’ like ‘foo’)返回FALSE,( ‘foobar’ like ‘foo _ _’或者 ‘foobar’ like ‘foo%’)则返回TURE
      A RLIKE B 字符串 如 果A或B值为”NULL”,结果返回”NULL”。字符串A与B通过java进行匹配,如果相符返回TRUE,不符返回FALSE。例如:( ‘foobar’ rlike ‘foo’)返回FALSE,(’foobar’ rlike ‘^f.*r$’ )返回TRUE。
      A REGEXP B 字符串 与RLIKE相同
    2. 算术运算符
      运算符类型说明
      A + B 所有数字类型 A和B相加。结果的与操作数值有共同类型。例如每一个整数是一个浮点数,浮点数包含整数。所以,一个浮点数和一个整数相加结果也是一个浮点数。
      A – B 所有数字类型 A和B相减。结果的与操作数值有共同类型。
      A * B 所有数字类型 A和B相乘,结果的与操作数值有共同类型。需要说明的是,如果乘法造成溢出,将选择更高的类型。
      A / B 所有数字类型 A和B相除,结果是一个double(双精度)类型的结果。
      A % B 所有数字类型 A除以B余数与操作数值有共同类型。
      A & B 所有数字类型 运算符查看两个参数的二进制表示法的值,并执行按位”与”操作。两个表达式的一位均为1时,则结果的该位为 1。否则,结果的该位为 0。
      A|B 所有数字类型 运算符查看两个参数的二进制表示法的值,并执行按位”或”操作。只要任一表达式的一位为 1,则结果的该位为 1。否则,结果的该位为 0。
      A ^ B 所有数字类型 运算符查看两个参数的二进制表示法的值,并执行按位”异或”操作。当且仅当只有一个表达式的某位上为 1 时,结果的该位才为 1。否则结果的该位为 0。
      ~A 所有数字类型 对一个表达式执行按位”非”(取反)。
    3. 逻辑运算符
      运算符类型说明
      A AND B 布尔值 A和B同时正确时,返回TRUE,否则FALSE。如果A或B值为NULL,返回NULL。
      A && B 布尔值 与”A AND B”相同
      A OR B 布尔值 A或B正确,或两者同时正确返返回TRUE,否则FALSE。如果A和B值同时为NULL,返回NULL。
      A | B 布尔值 与”A OR B”相同
      NOT A 布尔值 如果A为NULL或错误的时候返回TURE,否则返回FALSE。
      ! A 布尔值 与”NOT A”相同
    4. 复杂类型函数
      函数类型说明
      map (key1, value1, key2, value2, …) 通过指定的键/值对,创建一个map。
      struct (val1, val2, val3, …) 通过指定的字段值,创建一个结构。结构字段名称将COL1,COL2,…
      array (val1, val2, …) 通过指定的元素,创建一个数组。
    5. 对复杂类型函数操作

      函数类型说明
      A[n] A是一个数组,n为int型 返回数组A的第n个元素,第一个元素的索引为0。如果A数组为['foo','bar'],则A[0]返回’foo’和A[1]返回”bar”。
      M[key] M是Map<K, V>,关键K型 返回关键值对应的值,例如mapM为 {‘f’ -> ‘foo’, ‘b’ -> ‘bar’, ‘all’ -> ‘foobar’},则M['all'] 返回’foobar’。
      S.x S为struct 返回结构x字符串在结构S中的存储位置。如 foobar {int foo, int bar} foobar.foo的领域中存储的整数。

     

    内置函数
    1. 数学函数
      返回类型函数说明
      BIGINT round(double a) 四舍五入
      DOUBLE round(double a, int d) 小数部分d位之后数字四舍五入,例如round(21.263,2),返回21.26
      BIGINT floor(double a) 对给定数据进行向下舍入最接近的整数。例如floor(21.2),返回21。
      BIGINT ceil(double a), ceiling(double a) 将参数向上舍入为最接近的整数。例如ceil(21.2),返回23.
      double rand(), rand(int seed) 返回大于或等于0且小于1的平均分布随机数(依重新计算而变)
      double exp(double a) 返回e的n次方
      double ln(double a) 返回给定数值的自然对数
      double log10(double a) 返回给定数值的以10为底自然对数
      double log2(double a) 返回给定数值的以2为底自然对数
      double log(double base, double a) 返回给定底数及指数返回自然对数
      double pow(double a, double p) power(double a, double p) 返回某数的乘幂
      double sqrt(double a) 返回数值的平方根
      string bin(BIGINT a) 返回二进制格式
      string hex(BIGINT a) hex(string a) 将整数或字符转换为十六进制格式
      string unhex(string a) 十六进制字符转换由数字表示的字符。
      string conv(BIGINT num, int from_base, int to_base) 将 指定数值,由原来的度量体系转换为指定的试题体系。例如CONV(‘a’,16,2),返回。参考:’1010′ http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_conv
      double abs(double a) 取绝对值
      int double pmod(int a, int b) pmod(double a, double b) 返回a除b的余数的绝对值
      double sin(double a) 返回给定角度的正弦值
      double asin(double a) 返回x的反正弦,即是X。如果X是在-1到1的正弦值,返回NULL。
      double cos(double a) 返回余弦
      double acos(double a) 返回X的反余弦,即余弦是X,,如果-1<= A <= 1,否则返回null.
      int double positive(int a) positive(double a) 返回A的值,例如positive(2),返回2。
      int double negative(int a) negative(double a) 返回A的相反数,例如negative(2),返回-2。
    2. 收集函数
      返回类型函数说明
      int size(Map<K.V>) 返回的map类型的元素的数量
      int size(Array) 返回数组类型的元素数量
    3. 类型转换函数
      返回类型函数说明
      指定 “type” cast(expr as ) 类型转换。例如将字符”1″转换为整数:cast(’1′ as bigint),如果转换失败返回NULL。
    4. 日期函数
      返回类型函数说明
      string from_unixtime(bigint unixtime[, string format]) UNIX_TIMESTAMP参数表示返回一个值’YYYY- MM – DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,这取决于是否是在一个字符串或数字语境中使用的功能。该值表示在当前的时区。
      bigint unix_timestamp() 如果不带参数的调用,返回一个Unix时间戳(从’1970- 01 – 0100:00:00′到现在的UTC秒数)为无符号整数。
      bigint unix_timestamp(string date) 指定日期参数调用UNIX_TIMESTAMP(),它返回参数值’1970- 01 – 0100:00:00′到指定日期的秒数。
      bigint unix_timestamp(string date, string pattern) 指定时间输入格式,返回到1970年秒数:unix_timestamp(’2009-03-20′, ‘yyyy-MM-dd’) = 1237532400
      string to_date(string timestamp) 返回时间中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″
      string to_dates(string date) 给定一个日期date,返回一个天数(0年以来的天数)
      int year(string date) 返回指定时间的年份,范围在1000到9999,或为”零”日期的0。
      int month(string date) 返回指定时间的月份,范围为1至12月,或0一个月的一部分,如’0000-00-00′或’2008-00-00′的日期。
      int day(string date) dayofmonth(date) 返回指定时间的日期
      int hour(string date) 返回指定时间的小时,范围为0到23。
      int minute(string date) 返回指定时间的分钟,范围为0到59。
      int second(string date) 返回指定时间的秒,范围为0到59。
      int weekofyear(string date) 返回指定日期所在一年中的星期号,范围为0到53。
      int datediff(string enddate, string startdate) 两个时间参数的日期之差。
      int date_add(string startdate, int days) 给定时间,在此基础上加上指定的时间段。
      int date_sub(string startdate, int days) 给定时间,在此基础上减去指定的时间段。
    5. 条件函数
      返回类型函数说明
      T if(boolean testCondition, T valueTrue, T valueFalseOrNull) 判断是否满足条件,如果满足返回一个值,如果不满足则返回另一个值。
      T COALESCE(T v1, T v2, …) 返回一组数据中,第一个不为NULL的值,如果均为NULL,返回NULL。
      T CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END 当a=b时,返回c;当a=d时,返回e,否则返回f。
      T CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END 当值为a时返回b,当值为c时返回d。否则返回e。
    6. 字符函数
      返回类型函数说明
      int length(string A) 返回字符串的长度
      string reverse(string A) 返回倒序字符串
      string concat(string A, string B…) 连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串
      string concat_ws(string SEP, string A, string B…) 链接多个字符串,字符串之间以指定的分隔符分开。
      string substr(string A, int start) substring(string A, int start) 从文本字符串中指定的起始位置后的字符。
      string substr(string A, int start, int len) substring(string A, int start, int len) 从文本字符串中指定的位置指定长度的字符。
      string upper(string A) ucase(string A) 将文本字符串转换成字母全部大写形式
      string lower(string A) lcase(string A) 将文本字符串转换成字母全部小写形式
      string trim(string A) 删除字符串两端的空格,字符之间的空格保留
      string ltrim(string A) 删除字符串左边的空格,其他的空格保留
      string rtrim(string A) 删除字符串右边的空格,其他的空格保留
      string regexp_replace(string A, string B, string C) 字符串A中的B字符被C字符替代
      string regexp_extract(string subject, string pattern, int index) 通过下标返回正则表达式指定的部分。regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) returns ‘bar.’
      string parse_url(string urlString, string partToExtract [, string keyToExtract]) 返回URL指定的部分。parse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1′, ‘HOST’) 返回:’facebook.com’
      string get_json_object(string json_string, string path) select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a;
      string space(int n) 返回指定数量的空格
      string repeat(string str, int n) 重复N次字符串
      int ascii(string str) 返回字符串中首字符的数字值
      string lpad(string str, int len, string pad) 返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从左侧填补。
      string rpad(string str, int len, string pad) 返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从右侧填补。
      array split(string str, string pat) 将字符串转换为数组。
      int find_in_set(string str, string strList) 返回字符串str第一次在strlist出现的位置。如果任一参数为NULL,返回NULL;如果第一个参数包含逗号,返回0。
      array<array> sentences(string str, string lang, string locale) 将字符串中内容按语句分组,每个单词间以逗号分隔,最后返回数组。 例如sentences(‘Hello there! How are you?’) 返回:( (“Hello”, “there”), (“How”, “are”, “you”) )
      array<struct<string,double>> ngrams(array<array>, int N, int K, int pf) SELECT ngrams(sentences(lower(tweet)), 2, 100 [, 1000]) FROM twitter;
      array<struct<string,double>> context_ngrams(array<array>, array, int K, int pf) SELECT context_ngrams(sentences(lower(tweet)), array(null,null), 100, [, 1000]) FROM twitter;

     

    内置的聚合函数(UDAF)
    返回类型函数说明
    bigint count(*) , count(expr), count(DISTINCT expr[, expr., expr.]) 返回记录条数。
    double sum(col), sum(DISTINCT col) 求和
    double avg(col), avg(DISTINCT col) 求平均值
    double min(col) 返回指定列中最小值
    double max(col) 返回指定列中最大值
    double var_pop(col) 返回指定列的方差
    double var_samp(col) 返回指定列的样本方差
    double stddev_pop(col) 返回指定列的偏差
    double stddev_samp(col) 返回指定列的样本偏差
    double covar_pop(col1, col2) 两列数值协方差
    double covar_samp(col1, col2) 两列数值样本协方差
    double corr(col1, col2) 返回两列数值的相关系数
    double percentile(col, p) 返回数值区域的百分比数值点。0<=P<=1,否则返回NULL,不支持浮点型数值。
    array percentile(col, array(p~1,, [, p,,2,,]…)) 返回数值区域的一组百分比值分别对应的数值点。0<=P<=1,否则返回NULL,不支持浮点型数值。
    double percentile_approx(col, p[, B]) Returns an approximate p^th^ percentile of a numeric column (including floating point types) in the group. The B parameter controls approximation accuracy at the cost of memory. Higher values yield better approximations, and the default is 10,000. When the number of distinct values in col is smaller than B, this gives an exact percentile value.
    array percentile_approx(col, array(p~1,, [, p,,2_]…) [, B]) Same as above, but accepts and returns an array of percentile values instead of a single one.
    array<struct{‘x’,'y’}> histogram_numeric(col, b) Computes a histogram of a numeric column in the group using b non-uniformly spaced bins. The output is an array of size b of double-valued (x,y) coordinates that represent the bin centers and heights
    array collect_set(col) 返回无重复记录
    内置表生成函数(UDTF)
    返回类型函数说明
    数组 explode(array a) 数组一条记录中有多个参数,将参数拆分,每个参数生成一列。
      json_tuple get_json_object 语句:select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a; json_tuple语句: select a.timestamp, b.* from log a lateral view json_tuple(a.appevent, ‘eventid’, ‘eventname’) b as f1, f2

     

     

     

    自定义格式:(将自定义java代码打包成jar)

    自定义函数包括三种UDF、UDAF、UDTF

    UDF(User-Defined-Function) :一进一出

    UDAF(User- Defined Aggregation Funcation) :聚集函数,多进一出。Count/max/min

    UDTF(User-Defined Table-Generating Functions) :一进多出,如explore()

     

    UDF 开发

    1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。

    2、编写UDF函数的时候需要注意一下几点:

    a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。

    b)需要实现evaluate函数,evaluate函数支持重载。

    package com.xiaoke;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.Text;
    
    public class TuoMin extends UDF{
    
        public Text evaluate(final Text s) {
            if (s == null) {
                return null;
            }
            String str = s.toString().substring(0, 1) + "bjmsb";
            return new Text(str);
        }
    }
    步骤

    (1)将jar包上传到虚拟机中:

    a)把程序打包放到目标机器上去;

    b)进入hive客户端,添加jar包:hive>add jar /run/jar/udf_test.jar;

    c)创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';

    d)查询HQL语句:

    SELECT add_example(8, 9) FROM scores;

    SELECT add_example(scores.math, scores.art) FROM scores;

    SELECT add_example(6, 7, 8, 6.8) FROM scores;

    e)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;

    注意:此种方式创建的函数属于临时函数,当关闭了当前会话之后,函数会无法使用,因为jar的引用没有了,无法找到对应的java文件进行处理,因此不推荐使用。

     

    (2)将jar包上传到hdfs集群中:

    a)把程序打包上传到hdfs的某个目录下

    b)创建函数:hive>CREATE FUNCTION add_example AS 'hive.udf.Add' using jar "hdfs://mycluster/jar/udf_test.jar";

    d)查询HQL语句:

    SELECT add_example(8, 9) FROM scores;

    SELECT add_example(scores.math, scores.art) FROM scores;

    SELECT add_example(6, 7, 8, 6.8) FROM scores;

    e)销毁临时函数:hive> DROP FUNCTION add_example;

     

    函数实战:

    1.需求统计下面信息的个数。
        1-小王-苹果-葡萄-橘子
        3-小红-苹果-香蕉-柜子
        4-小绿-苹果-香蕉-电脑
    2.上传hdfs -> /xinzai002
    3.Hive上创建表关联: create external table words(word string) location '/xinzai001';
    4.切割成数组:select split(word, '-') from words;
        ["1","小王","苹果","葡萄","橘子"]
        ["3","小红","苹果","香蕉","柜子"]
        ["4","小绿","苹果","香蕉","电脑"]
    5.利用函数切割成单词:select explode(split(word, '-')) from words;
    6.创建统计表:create table wordcount(word string, count int);
    7.进行统计from (select explode(split(word, '-')) word  from words) t insert into wc_result select word, count(word) group by t.word;
    8.现象:会启动一个mapreduce任务
    9.结果:
    hive> select * from wordcount;
    OK
    1    1
    3    1
    4    1
    小王    1
    小红    1
    小绿    1
    柜子    1
    橘子    1
    电脑    1
    苹果    3
    葡萄    1
    香蕉    2

    mapreduce效果图:

            注意: hive 的每个sql操作都是MR任务,之所以查询创建表l不显示是因为hive做了优化

    Hive参数操作和运行方式

    Hive参数操作
    1. hive参数介绍

      1. Hive中通过命令: set;查看

      2. hive外通过命令: hive -e "set";

      3. 解释:hive当中的参数、变量都是以命名空间开头的,详情如下表所示:

        命名空间读写权限含义
        hiveconf 可读写 hive-site.xml当中的各配置变量例:hive --hiveconf hive.cli.print.header=true
        system 可读写 系统变量,包含JVM运行参数等例:system:user.name=root
        env 只读 环境变量例:env:JAVA_HOME
        hivevar 可读写 例:hive -d val=key
    2. hive参数的设置方式

      1. 在${HIVE_HOME}/conf/hive-site.xml文件中添加参数设置(注意:永久生效,所有的hive会话都会加载对应的配置)

      2. 在启动hive cli时,通过--hiveconf key=value的方式进行设置。 例如:hive --hiveconf hive.cli.print.header=true(注意:只在当前会话有效,退出会话之后参数失效)

      3. 在进入到cli之后,通过set命令设置. 例如:set hive.cli.print.header=true;()

        --在hive cli控制台可以通过set对hive中的参数进行查询设置
        --set设置
        set hive.cli.print.header=true;
        --set查看
        set hive.cli.print.header
        --set查看全部属性
        set
      4. hive参数初始化设置:在当前用户的家目录下创建.hiverc文件,在当前文件中设置hive参数的命令,每次进入hive cli的时候,都会加载.hiverc的文件,执行文件中的命令。(注意:在当前用户的家目录下还会存在.hivehistory文件,此文件中保存了hive cli中执行的所有命令)

    Hive运行方式
    1. hive运行方式分类
      1. 命令行方式或者控制台模式

      2. 脚本运行方式(实际生产环境中用最多)

      3. JDBC方式:hiveserver2

      4. web GUI接口(hwi、hue等)

    2. hive命令行模式详解
      1. 在命令行中可以直接输入SQL语句,例如:select * from table_name

      2. 在命令行中可以与HDFS交互,例如:dfs ls /

      3. 在命令行中可以与linux交互,例如:! pwd或者! ls / (注意:与linux交互的时候必须要加!

    3. hive脚本运行方式

      --hive直接执行sql命令,可以写一个sql语句,也可以使用;分割写多个sql语句
          hive -e ""
      --hive执行sql命令,将sql语句执行的结果重定向到某一个文件中
          hive -e "" >> aaa.t.txtxt
      --hive静默输出模式,输出的结果中不包含ok,time token等关键字
          hive -S -e "" >> aaa.txt
      --hive可以直接读取文件中的sql命令,进行执行
          hive -f file
      --hive可以从文件中读取命令,并且执行初始化操作
          hive -i /home/my/hive-init.sql
      --在hive的命令行中也可以执行外部文件中的命令
          hive> source file (在hive cli中运行)

       

       

     

  • 相关阅读:
    LINUX的SSH下FTP到远程服务器Entering Passive Mode失败解决
    LINUX的SSH下FTP到远程服务器Entering Passive Mode失败解决
    LINUX的SSH下FTP到远程服务器Entering Passive Mode失败解决
    git rm简介
    git rm简介
    git rm简介
    linux rz -e
    新版住院电子病历首页 (2012年修订说明)
    DateEdit和TimeEdit用法
    ORA-22868: 具有 LOB 的表包含有位于不同表空间的段
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14125671.html
Copyright © 2011-2022 走看看