Hive-внешняя (динамически) секционированная таблица
у меня есть таблица в MySQL viz. nas_comps.
select comp_code, count(leg_id) from nas_comps_01012011_31012011 n group by comp_code;
comp_code count(leg_id)
'J' 20640
'Y' 39680
во-первых, я импортировал данные в HDFSHadoop версии 1.0.2) с помощью Sqoop:
sqoop import --connect jdbc:mysql://172.25.37.135/pros_olap2
--username hadoopranch
--password hadoopranch
--query "select * from nas_comps where dep_date between '2011-01-01' and '2011-01-10' AND $CONDITIONS"
-m 1
--target-dir /pros/olap2/dataimports/nas_comps
затем, я создал внешнюю, секционированную таблицу Hive :
/*shows the partitions on 'describe' but not 'show partitions'*/
create external table nas_comps(DS_NAME string,DEP_DATE string,
CRR_CODE string,FLIGHT_NO string,ORGN string,
DSTN string,PHYSICAL_CAP int,ADJUSTED_CAP int,
CLOSED_CAP int)
PARTITIONED BY (LEG_ID int, month INT, COMP_CODE string)
location '/pros/olap2/dataimports/nas_comps'
столбцы разделов отображаются при описании:
hive> describe extended nas_comps;
OK
ds_name string
dep_date string
crr_code string
flight_no string
orgn string
dstn string
physical_cap int
adjusted_cap int
closed_cap int
leg_id int
month int
comp_code string
Detailed Table Information Table(tableName:nas_comps, dbName:pros_olap2_optim,
owner:hadoopranch, createTime:1374849456, lastAccessTime:0, retention:0,
sd:StorageDescriptor(cols:[FieldSchema(name:ds_name, type:string, comment:null),
FieldSchema(name:dep_date, type:string, comment:null), FieldSchema(name:crr_code,
type:string, comment:null), FieldSchema(name:flight_no, type:string, comment:null),
FieldSchema(name:orgn, type:string, comment:null), FieldSchema(name:dstn, type:string,
comment:null), FieldSchema(name:physical_cap, type:int, comment:null),
FieldSchema(name:adjusted_cap, type:int, comment:null), FieldSchema(name:closed_cap,
type:int, comment:null), FieldSchema(name:leg_id, type:int, comment:null),
FieldSchema(name:month, type:int, comment:null), FieldSchema(name:comp_code, type:string,
comment:null)], location:hdfs://172.25.37.21:54300/pros/olap2/dataimports/nas_comps,
inputFormat:org.apache.hadoop.mapred.TextInputFormat,
outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false,
numBuckets:-1, serdeInfo:SerDeInfo(name:null,
serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:
{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:
[FieldSchema(name:leg_id, type:int, comment:null), FieldSchema(name:month, type:int,
comment:null), FieldSchema(name:comp_code, type:string, comment:null)],
parameters:{EXTERNAL=TRUE, transient_lastDdlTime=1374849456}, viewOriginalText:null,
viewExpandedText:null, tableType:EXTERNAL_TABLE)
но я не уверен, что разделы созданы, потому что:
hive> show partitions nas_comps;
OK
Time taken: 0.599 seconds
select count(1) from nas_comps;
возвращает 0 записей
как создать внешняя таблица Hive с динамическими разделами?
2 ответов
Hive не будет создавать разделы для вас таким образом.
Просто создайте таблицу, разделенную нужным ключом раздела, а затем выполните insert overwrite table
из внешней таблицы в новую секционированную таблицу (задание hive.exec.dynamic.partition=true
и hive.exec.dynamic.partition.mode=nonstrict
).
если вы должны сохранить таблицу секционированной извне, вы должны вручную создать каталоги (1 каталог на раздел имя должно быть PARTION_KEY=VALUE
)
тогда используйте MSCK REPAIR TABLE table_name;
команда
Динамический Раздел
раздел добавляется динамически во время вставки записи в таблицу hive.
- поддержка только с инструкцией insert.
- не поддерживается
load data
заявление. - необходимо включить параметры динамического раздела перед вставкой данных в таблицу hive.
hive.exec.dynamic.partition.mode=nonstrict
значение по умолчаниюstrict
hive.exec.dynamic.partition=true
значение по умолчаниюfalse
.
Динамический Раздел Запрос
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.dynamic.partition=true;
INSERT INTO table_name PARTITION (loaded_date)
select * from table_name1 where loaded_date = 20151217
здесь loaded_date = 20151217
раздела и его стоимости.
ограничения:
- динамический раздел будет работать только с вышеуказанным заявлением.
- он будет создавать раздел динамически в соответствии с данными, которые он выбирает из С
table_name1
;
если ваше состояние не соответствует вышеуказанным критериям, то:
создать секционированную таблицу тогда сделай так:
ALTER TABLE table_name ADD PARTITION (DS_NAME='partname1',DATE='partname2');
или пожалуйста, используйте этот ссылке для создания динамического раздела.