当前位置:   article > 正文

hive使用技巧:把很多小文件导入一张表中、显示在文件中位置和行数等。

hive使用技巧:把很多小文件导入一张表中、显示在文件中位置和行数等。

1.使用MSCK命令导入输入到hive表

我们有时候会遇到很多小文件需要导入到一张hive表里面,但是一个个导入非常麻烦。

假设创建一个外部表,这个表在hdfs的order文件夹里,但是这个文件夹现在是空的。所以用select * 是没有数据的。

  1. CREATE EXTERNAL TABLE order(
  2. order STRING
  3. , time STRING
  4. )
  5. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  6. LOCATION '/hive/order';

我们通过hdfs dfs -put 方式把数据导入到hdfs的order 文件夹下。

然后在hive里面输入命令 msck repair table order;

现在再select * 就有数据了。通过这种方式,可以很快导入数据到表格里面,而不用一个个alter ...add partition来导入。

2.使用describe formatted order_creates;可以查看表具体信息,包括位置,分隔符等。formatted不写就看简单点的。

3.关闭动态分区模式

 如果insert语句报错的时候Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict

可以先进行如下设置在操作。set hive.exec.dynamic.partition.mode=nonstrict;

有关动态分区表模式

  1. hive.exec.dynamic.partition=false #默认不允许动态分区表
  2. hive.exec.dynamic.partition.mode=strict #设置动态分区模式
  3. hive.exec.max.dynamic.partitions.pernode=100 #动态分区在每个map、reducer里面创建数量
  4. hive.exec.max.dynamic.partitions=1000 #动态分区被创建总数
  5. hive.exec.max.created.files=100000 #所有mapper创建最大HDFS文件数
  6. hive.error.on.empty.partition=false

4.查看每行在文件中的位置和行数

select INPUT__FILE__NAME,col1,col2, round(BLOCK__OFFSET__INSIDE__FILE / (length(col1) + length(col2) + 2) + 1) from  tablename; 

这里的BLOCK_OFFSET_FILE表示在文件中的位置,除以两个列宽度加2(行首和行尾的\t键),最后加1表示第0行显示成1.

5.修改文件格式

  1. ALTER TABLE order PARTITION (col1='2014-06') SET SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe';
  2. ALTER TABLE order PARTITION (col1='2014-06') SET FILEFORMAT textfile;
  3. ALTER TABLE order PARTITION (clo1='2014-07') SET FILEFORMAT INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat' OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat';

6.使用collect_set(不允许重复),collect_list(允许重复)对结果进行分组显示

select a, collect_set(b) as orders  from tablename  group by a;

在impala中可以使用group_concat(b,'|')用|把分组结果连接一起显示出来。

7.使用array数组

假设原始数据格式是   a b   c|d|e    ,其中第三个字段是数组,用|作为分隔符,建表的时候使用collection item by

  1. CREATE EXTERNAL TABLE ad_list (
  2. a STRING
  3. , b STRING
  4. , c array<STRING>
  5. )
  6. ROW FORMAT DELIMITED
  7. FIELDS TERMINATED BY '\t'
  8. COLLECTION ITEMS TERMINATED BY '|'
  9. LOCATION '/tmp';

8.使用LATERAL VIEW 横向视图 和explode函数进行横向展开

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

select a, c from tablename LATERAL VIEW explode(c1)  t AS c;这里的c1就是原表中的数组。

这种情况下,如果数组里面是空的,这一行就不会显示,要想显示,可以使用LATERALVIEW OUTER概念有的类似out join 。

9.使用sort_array()函数和array_contains()

sort_array()函数对数组进行排序,array_contains()函数判断是否包含字符。

10.hive的map类型

创建表的时候,需要加上MAP KEYS TERMINATED BY ':',可以加在location之前。下面介绍一下函数

创建map:map(),str_to_map()  

 例子,items这个字段是map类型的数据,比如a:2|b:5|c:7这种类型的:

  1. CREATE EXTERNAL TABLE orders (
  2. user_id STRING
  3. , items map<STRING,BIGINT>
  4. )
  5. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  6. COLLECTION ITEMS TERMINATED BY '|'
  7. MAP KEYS TERMINATED BY ':'
  8. LOCATION '/tmp';

取数:map_keys(),map_values()

使用:map与lateral view

select user_id, order_id, item, amount from f_orders LATERAL VIEW explode(items) t AS item, amount;

11.hive的窗口和分析函数

row_number():取行号,比如取最大的三个where row_number<3,也可以row_number() OVER (PARTITION BY user_id ORDER BY weight DESC)

rank()和dense_rank():排名

12.使用translate()函数对字符进行替换,以便于保护用户隐私,比如邮箱替换,把u换成1,把s换成2.....

translate(email, 'userfxgmail1234567890', '1234567890userfxgmail')

13.增加delete和update

如果删除数据的时候遇到报错

FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.

可以修改hive-site.xml增加如下信息,之后重启hive服务。

  1. <property>
  2. <name>hive.support.concurrency</name>
  3. <value>true</value>
  4. </property>
  5. <property>
  6. <name>hive.enforce.bucketing</name>
  7. <value>true</value>
  8. </property>
  9. <property>
  10. <name>hive.exec.dynamic.partition.mode</name>
  11. <value>nonstrict</value>
  12. </property>
  13. <property>
  14. <name>hive.txn.manager</name>
  15. <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
  16. </property>
  17. <property>
  18. <name>hive.compactor.initiator.on</name>
  19. <value>true</value>
  20. </property>
  21. <property>
  22. <name>hive.compactor.worker.threads</name>
  23. <value>1</value>
  24. </property>
  25. <property>
  26. <name>hive.in.test</name>
  27. <value>true</value>
  28. </property>

如果要支持delete和update,则必须输出是AcidOutputFormat然后必须分桶。 
而且目前只有ORCFileformat支持AcidOutputFormat,不仅如此建表时必须指定参数('transactional' = true) 

如clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true')

14.hive窗口函数进阶

分析函数用法over(partition by xxx order by yyy rows between zzz)

unbounded preceding即第一行是指表中的第一行, unbounded following即最后一行是指表中的最后一行

• CUME_DIST(累积分布、)  小于等于当前行值的行数 / 总行数:CUME_DIST() OVER(PARTITION BY xxx ORDER BY xxx)
• PERCENT_RANK  当前rank值-1 / 总行数-1:CUME_DIST() OVER(PARTITION BY dept ORDER BY sal)
• NTILE 将窗口分成n片:ntile (num)  over ([partition_clause]  order_by_clause)
• LEAD(col, n, 0)  窗口内下n行值(后两个参数可以省略、第三个参数是 超出记录窗口时的默认值):
• LAG(col, n , default)  窗口内上n行值:lag(name,1,0) over ( order by id ) ,可以找到name上个月对比,假设每月一行
• FIRST_VALUE 窗口内第一个值
• LAST_VALUE  窗口内最后一个值

以上函数都可以跟分析函数一起使用

• CURRENT ROW  当前行:可以与rows between and一起使用
• N-rows PRECEDING  前面N行
• N-rows FOLLOWING  后面N行

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/718807
推荐阅读
相关标签
  

闽ICP备14008679号