mysql hive sqoop 分区,优化

sqoop 报错  for input string \N   是因为 hive 用\N 存 NULL, 这样就需要 设置input-null-string '\\\\N' input-null-non-string '\\\\N'

 

sqoop import --connect jdbc:oracle:thin:@//10.95.98.145:1521/zxin -e "select * from MPRODUCT_DOWNLOAD_RECORD09 where $cond and  \$CONDITIONS" --target-dir '/user/zhongjw/mproduct_download_record09'  --fields-terminated-by '\t' --lines-terminated-by '\n' --null-string ' ' --null-non-string '0'  -m 20 --split-by 'ENDTIME' --username ZXDBM_REPORT --password 20v#bao#10


 

如果使用sqoop 导入可以先将表设计为innodb 并发导入 然后将表改成myisam(锁表,不支持并发导入) 

 

 

分区字段必须包含在联合主键中

alter table muser_openclient
partition by RANGE (log_time)
(
PARTITION p201301 VALUES LESS THAN (20130200),
PARTITION p201302 VALUES LESS THAN (20130300),
PARTITION p201303 VALUES LESS THAN (20130400),
PARTITION p201304 VALUES LESS THAN (20130500)
);

mysql> show variables like ‘key_buffer_size‘;+-----------------+------------+
| Variable_name    | Value       |
+-----------------+------------+
| key_buffer_size | 536870912 |
+-----------------+------------+
分配了512MB内存给key_buffer_size,我们再看一下key_buffer_size的使用情况:
mysql> show global status like ‘key_read%‘;
+------------------------+-------------+
| Variable_name           | Value        |
+------------------------+-------------+
| Key_read_requests       | 27813678764 |
| Key_reads               | 6798830      |


+------------------------+-------------+
  一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引


通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:

当concurrent_insert=0时,不允许并发插入功能。
当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。

当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入。

show profile是由Jeremy Cole捐献给MySQL社区版本的。默认的是关闭的,但是会话级别可以开启这个功能。开启它可以让MySQL收集在执行语句的时候所使用的资源。为了统计报表,把profiling设为1


mysql> SET profiling = 1;

mysql> SHOW PROFILES\G

show profile for query 2

 

mysql 字符串字段分区

alter table sdk_flowadd_sum_tmp_v1
PARTITION by range columns(log_day)
(
partition p20130731 values less than('20130731'),
partition p20130801 values less than('20130801'),
partition p20130802 values less than('20130802'),
partition p20130803 values less than('20130803'),
partition p20130804 values less than('20130804'),
partition p20130805 values less than('20130805')

)

ALTER TABLE sdk_flowadd_sum_tmp_v1  ADD PARTITION (PARTITION p20130806 VALUES LESS THAN ('20130806'))


mysql char 类型 超过 150个字节 如果group by  无论多少数据 都会在磁盘上创建临时文件 将定性能




create table day_table (id int, content string) partitioned by (dt string);



动态分区

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;




 

INSERT OVERWRITE TABLE target PARTITION (dt) 
SELECT id,user_id,app_id,time,ip,substr(time,0,10) FROM origin

可以将老数据load 到hive表中后, 然后在用insert select 方式给老数据创建分区。

 

在处理好老数据分区后,用静态分区:

 

create table partuserview(userid string,hourid string,cityid string,fronturl string,contentype int)  partitioned by (dt string) row format delimited fields terminated by '\t';

load data local inpath '/home/xincl/hive-0.6.0/data/userview.txt' into table partuserview partition(dt='20101110');

 

创建bucket表语句:
> create  table butuserview(userid string,hourid string,cityid string,fronturl string,contentype int)  clustered by (hourid) into 12 buckets row format delimited fields terminated by '\t';
上面指定使用hourid来做bucket,有12个bucket。用hourid的hashcode MOD bucket个数。

 


sqoop 引用分区:


  sqoop import --connect jdbc:postgresql://ip/db_name --username user_name  --table table_name  --hive-import -m 5 --hive-table hive_table_name  (--hive-partition-key partition_name --hive-partition-value partititon_value);

 

 

修改字段类型:

 ALTER TABLE MUSER_BASICINFO_CPA CHANGE USERINDEX USERINDEX bigint;



你可能感兴趣的:(hadoop)