1. Hive导出到.csv文件
由于Hive中导出的文件不是以逗号,而是以Tab(或者说'\t')为分隔符的,因此,下面的命令自己试过可以转换为逗号分隔的文件,也就是真正的csv文件。
当然,有时候可能还需要跟转码的工具进行组合,转换编码格式。
sed -i 's/\t/,/g' xxx.csv
当然,第一步是
hive -e "SQL语句" > xxx.csv
所以完整的流程代码是
hive -e "SQL query" > xxx.csv
sed -i 's/\t/,/g' xxx.csv
2. Hive导入.csv文件建表
注意:
为了配合csv文件,建表的时候,最后一行的row format delimited fields terminated by ',';必须要有,否则列会出问题
(这牵涉到csv和tsv等问题)
所以,在Hive下完整的删表建表导数据的流程如下:
--删表建表:
drop table if existstablename;
CREATE TABLE if not exists tablename(
scope_id STRING COMMENT 'xxxx',
web_id STRING COMMENT 'xxx',
from_sku_id STRING COMMENT 'xxxx',
to_sku_id STRING COMMENT 'xxxx',
switching_prob FLOAT COMMENT 'xxxx',
predictor STRING COMMENT 'xxxx'
)
COMMENT '自替代性预测结果表'
PARTITIONED BY (dt STRING, cd3 STRING)
row format delimited fields terminated by ',';
--导入数据:
load data local inpath '/home/mart_vdp/anshuai/1389_pre_output.csv'
into table app.app_vdp_slct_pre_self_switching_prob PARTITION(dt='2017-03-31' ,cd3='1389');
3. Hive看包括行数在内的信息
show tblproperties table_name;
desc formatted table_name;
4. Hive一次写入一个表的多个分区的数据
set hive.exec.dynamici.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table tablename partition(partition_column)
select col1, col2,..., partition_column from tablename2
只要把带插入数据表格的全部非分区字段,后面在附上分区字段,就会按照分区字段的值插入相应分区。
5. Hive一次写入大量分区
--一个dml语句允许创建的所有分区的最大数量
set hive.exec.max.dynamic.partitions=100000;
--每一个mapreduce job允许创建的分区的最大数量,如果超过了这个数量就会报错
set hive.exec.max.dynamic.partitions.pernode=100000;
--hive.exec.max.created.files :所有的mapreduce job允许创建的文件的最大数量
set hive.exec.max.created.files=10000;
6. Hive运行中避免小文件产生的方法
--在MapReduce的任务结束时合并小文件
set hive.merge.mapredfiles=true;
7. Hive开启本地模式
set hive.exec.mode.local.auto=true;
8. org.apache.hadoop.mapreduce.counters.LimitExceededException: Too many counters: 201 max=200 这个错误的解决办法
set hive.exec.dynamici.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=100000;
set hive.exec.max.dynamic.partitions.pernode=100000;
set hive.exec.max.created.files=50000;
set mapreduce.job.counters.group.name.max=100000;
set mapreduce.job.counters.counter.name.max=100000;
--这句话很重要!
set mapreduce.job.counters.max=100000;
9. Hive输出加上表头
set hive.cli.print.header=true;