2013-07-26 11 views
6

Ich habe eine Tabelle in MySQL viz. nas_comps.Hive - externe (dynamisch) partitionierte Tabelle

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 

Zuerst habe ich importierte Daten auf HDFSHadoop Version 1.0.2) mit 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 

Dann habe ich eine externe, partitioniert Hive Tabelle:

/*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' 

Die Trennsäulen werden gezeigt, wenn beschrieben:

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) 

Aber ich bin nicht sicher, ob die Partitionen, weil erstellt:

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


select count(1) from nas_comps; 

kehren 0 Datensätze

Wie kann ich eine externe Hive Tabelle mit dynamischen Partitionen zu erstellen?

Antwort

9

Hive erstellt auf diese Weise keine Partitionen für Sie.
Erstellen Sie einfach eine Tabelle, die durch den gewünschten Partitionsschlüssel partitioniert ist, und führen Sie dann aus der externen Tabelle in die neue partitionierte Tabelle aus (Einstellung hive.exec.dynamic.partition=true und hive.exec.dynamic.partition.mode=nonstrict).

Wenn Sie die Tabelle extern partitioniert halten müssen Sie manuell die Verzeichnisse erstellen (1 Verzeichnis pro Partition sollte der Name sein PARTION_KEY=VALUE) dann mit dem MSCK REPAIR TABLE table_name;command

5

Dynamische Partition

Partition wird beim Einfügen des Datensatzes in hive Tabelle dynamisch hinzugefügt.

  1. Unterstützung nur mit Insert-Anweisung.
  2. Nicht unterstützt mit load data Anweisung.
  3. Sie müssen die dynamischen Partitionseinstellungen aktivieren, bevor Sie Daten in die Hive-Tabelle einfügen. hive.exec.dynamic.partition.mode=nonstrict Standardwert ist strict hive.exec.dynamic.partition=true Standardwert ist false.

Dynamische Partition Abfrage

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 

Hier loaded_date = 20151217 ist Partition und ihren Wert.

Einschränkungen:

  1. Dynamische Partition nur mit obiger Aussage arbeiten.
  2. Es wird die Partition dynamisch nach den Daten, die es aus der loaded_date Spalte aus der table_name1 auswählen;

Wenn Ihr Zustand mit oben genannten Kriterien nicht übereinstimmt, dann:

Erstellen Sie zunächst eine partitionierten Tabelle dann wie folgt tun:

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

oder Bitte verwenden Sie diesen Link für die dynamische Erstellung von Partitionen.

+0

Ja, ich habe dies geprüft, aber diese sind nicht dynamisch Partitionen - man muss noch Werte für die Partitionen angeben. –

+1

Richtig, Führen Sie es durch Shell-Skript.Sie ​​können eine Variable in Shell-Skript für die Partition erstellen und übergeben Sie es in alter table Befehl, sonst keine Option derzeit verfügbar :( –

Verwandte Themen