最佳的复制一个partitioned表的步骤:
- 创建新的目标,跟旧表一样的schema. 如:
create table new_xx like xx; - 使用 hadoop fs -cp 把旧表所有的分区文件,拷贝到目标表的文件夹。
- 运行 MSCK REPAIR TABLE new_xx.
这样就可以完成一个partition表的复制
应对Load Data时,分隔符在field中出现
对于TextFormat的hive表,当文本格式的数据,每列的分隔符是 逗号‘,',而其中一列中的数据也包含逗号的时候,直接load会造成列的分割混乱。 这个时候, 可以使用escaped来解决这个问题:
- 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'='\\');
- 文本文件中,对列中含有','的, 替换为 ',',使用转义。
hive local 模式
在hive shell中。 当用limit 1查看数据概况。 或者操作的数据量小,不需要在多个结点之间shuffle的时候。可以使用hive 的local模式,不用申请集群资源,反而能更快得到结果。
set hive.exec.mode.local.auto = true;
会自动根据查询,判断是否采用local模式
hive beeline 使用心得
- 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"