2013-07-26 16 views
6

Mam tabelę w serwisie MySQL. nas_comps.Hive - zewnętrzna (dynamicznie) podzielona na partycje tabela

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 

Najpierw importowanych danych na HDFSHadoop wersja 1.0.2) z użyciem 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 

Potem utworzony zewnętrzny, rozdzielono tabeli 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' 

Kolumny działowe są wyświetlane, gdy są opisane:

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) 

Ale nie jestem pewien, czy partycje są tworzone, ponieważ:

hive> show partitions nas_comps; 
OK 
Time taken: 0.599 seconds 


select count(1) from nas_comps; 

zwraca 0 rekordy

Jak mogę utworzyć zewnętrzną tabelę rój z dynamicznych partycji?

Odpowiedz

9

Hive nie stworzy w ten sposób partycji.
Po prostu utwórz tabelę podzieloną na partycje według żądanego klucza partycji, a następnie wykonaj insert overwrite table z tabeli zewnętrznej na nową tabelę partycjonowaną (ustawienie hive.exec.dynamic.partition=true i hive.exec.dynamic.partition.mode=nonstrict).

Jeśli trzeba zachować tabelę podzielono na zewnątrz trzeba ręcznie utworzyć katalogi (1 katalog na partycji nazwa powinna być PARTION_KEY=VALUE) następnie użyć MSCK REPAIR TABLE table_name;command

5

dynamicznego podziału

Partycja zostanie dodany dynamicznie podczas wstawiania rekordu do ula tabeli.

  1. Obsługa tylko z instrukcją wstawiania.
  2. Nieobsługiwane z instrukcją load data.
  3. Konieczność włączenia dynamicznych ustawień partycji przed wstawieniem danych do tabeli ula. Domyślna wartość to strict hive.exec.dynamic.partition=true domyślna wartość to false.

dynamiczne Query Partition

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 

Tutaj loaded_date = 20151217 jest przegroda, a jej wartość.

Ograniczenia:

  1. Dynamiczny partycja będzie działać tylko z powyższym stwierdzeniem.
  2. Tworzy partycję dynamicznie zgodnie z danymi, które wybrał z kolumny loaded_date z table_name1;

Jeśli warunek ten nie jest zgodny z powyższych kryteriów, a następnie:

najpierw utworzyć podzielono stół zrób tak:

ALTER TABLE table_name ADD PARTITION (DS_NAME='partname1',DATE='partname2'); 

lub proszę skorzystać z tej Link do dynamicznego tworzenia partycji.

+0

Tak, sprawdziliśmy to, ale nie są to dynamiczne partycje - należy jeszcze podać wartości dla partycji. –

+1

W prawo, Uruchom go za pomocą skryptu powłoki. Możesz utworzyć zmienną w skrypcie powłoki dla partycji i przekazać ją w poleceniu alter table, w przeciwnym razie żadna opcja nie jest dostępna :( –

Powiązane problemy