5. Hadoop之旅——Hive使用篇(二)

最佳的复制一个partitioned表的步骤:

  1. 创建新的目标,跟旧表一样的schema. 如:
    create table new_xx like xx;
  2. 使用 hadoop fs -cp 把旧表所有的分区文件,拷贝到目标表的文件夹。
  3. 运行 MSCK REPAIR TABLE new_xx.
    这样就可以完成一个partition表的复制

应对Load Data时,分隔符在field中出现

对于TextFormat的hive表,当文本格式的数据,每列的分隔符是 逗号‘,',而其中一列中的数据也包含逗号的时候,直接load会造成列的分割混乱。 这个时候, 可以使用escaped来解决这个问题:

  1. create table 中指定 ESCAPED BY, 指定转义符,如下使用''作为转义符
create teable 
……
ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ESCAPED BY '\\';  
……

对于已经存在的表,可以增加escape.delim

ALTER TABLE XXXX   
set serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES ('escape.delim'='\\');
  1. 文本文件中,对列中含有','的, 替换为 ',',使用转义。

hive local 模式

在hive shell中。 当用limit 1查看数据概况。 或者操作的数据量小,不需要在多个结点之间shuffle的时候。可以使用hive 的local模式,不用申请集群资源,反而能更快得到结果。
set hive.exec.mode.local.auto = true; 会自动根据查询,判断是否采用local模式

hive beeline 使用心得

  1. beeline 提交hive任务,产生OOM异常, java.lang.OutOfMemoryError: GC overhead limit exceeded:
    beeline 任务会启动一个java进程,设置了-Xmx,当返回行数过多,内存使用太高,会频繁的GC,从而出现这个错误。
    *改进办法: 增加beeline启动参数--incremental=true, 增量模式返回结果。
    例子:
/home/work/tars/hive-0.13.1-cdh5.2.0-all/bin/beeline --incremental=true -u "jdbc:hive2://XXX" --outputformat=tsv -e "set mapreduce.job.queuename=default" -e "${SQL}" > "/data/output_information"

推荐阅读更多精彩内容