2016-07-20 7 views
1
  • I externe Tabelle erstellt wie folgt ...Mit Funken/scala, verwende ich saveAsTextFile() auf HDFS, aber hiveql ("select count (*) from ...) return 0

    hive -e "create external table temp_db.temp_table (a char(10), b int) PARTITIONED BY (PART_DATE VARCHAR(10)) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/work/temp_db/temp_table'"

  • Und ich saveAsTextFile() mit scala in IDEA IntelliJ wie folgt ... itemsRdd.map(_.makeTsv).saveAsTextFile("hdfs://work/temp_db/temp_table/2016/07/19")

  • so ist die Datei (Felder beendet durch '\ t') war in der /work/temp_db/temp_table/2016/07/19. hadoop fs -ls /work/temp_db/temp_table/2016/07/19/part-00000 <- data file..

  • Aber, ich habe mit hiveql überprüft, gibt es keine Daten wie folgt. hive -e "select count(*) from temp_db.temp_table" -> 0. hive -e "select * from temp_db.temp_table limit 5" -> 0 rows fetched.

  • Hilf mir, was zu tun ist. Vielen Dank.

Antwort

1

Sie sparen an falscher Stelle von Funken. Der Name des Partitionsziels folgt part_col_name=part_value.

In Funken: Datei speichern im Verzeichnis part_date=2016%2F07%2F19 unter temp_table dir

itemsRdd.map(_.makeTsv) 
.saveAsTextFile("hdfs://work/temp_db/temp_table/part_date=2016%2F07%2F19") 

Partitionen hinzufügen: Sie müssen Partition hinzufügen, die hive Tabelle Metadaten (Partition dir aktualisieren sollten wir von Funken als hive erstellt haben erwartet key=value Format)

alter table temp_table add partition (PART_DATE='2016/07/19');

[[email protected] ~]$ hadoop fs -ls /user/hive/warehouse/temp_table/part*|awk '{print $NF}' 
/user/hive/warehouse/temp_table/part_date=2016%2F07%2F19/part-00000 
/user/hive/warehouse/temp_table/part_date=2016-07-19/part-00000 

Abfrage partitioniert Daten:

hive> alter table temp_table add partition (PART_DATE='2016/07/19'); 
OK 
Time taken: 0.16 seconds 
hive> select * from temp_table where PART_DATE='2016/07/19'; 
OK 
test1  123 2016/07/19 
Time taken: 0.219 seconds, Fetched: 1 row(s) 
hive> select * from temp_table; 
OK 
test1  123 2016/07/19 
test1  123 2016-07-19 
Time taken: 0.199 seconds, Fetched: 2 row(s) 

Für Jeden Tag Prozess: Sie saprk Job wie das laufen kann - nur Partitionen hinzufügen, direkt nach saveAsTextFile(), die s in alter Anweisung aslo zu beachten. es ist müssen Variable in hive sql von Funken weitergeben müssen:

val format = new java.text.SimpleDateFormat("yyyy/MM/dd") 
vat date = format.format(new java.util.Date()) 

itemsRDD.saveAsTextFile("/user/hive/warehouse/temp_table/part=$date") 

val hive = new HiveContext(sc)                
hive.sql(s"alter table temp_table add partition (PART_DATE='$date')") 

HINWEIS: Partition hinzufügen, nachdem die Datei oder sonst Funkenspar wird werfen Verzeichnis bereits existieren Ausnahme als hive dir erzeugt (falls nicht vorhanden), wenn Partition hinzufügen.

+0

Vielen Dank !!! Ich plane hdfs Verzeichnis zu verwalten, wie folgt ... ".../temp_table/2016/07/19" " .../temp_table/2016/07/20" ... ... So ... Soll ich jeden Tag die Klausel "alter table temp_table add partition (part_date = ....)" anweisen? – minsu

+0

Und ... Ich möchte den Namen "part_date" verstecken. Also, ich möchte ... ".../temp_table/2016/07/19" (Jahre/Monate/Tage, jedes Verzeichnis), Nicht ".../temp_table/part_date = 2016% 2F07% 2F19" . Danke !! – minsu

+0

für die tägliche Belastung können Sie Funken Job erstellen (siehe aktualisierte Antwort). zum Umbenennen des Partitionsverzeichnisses benutzen Sie den unteren Befehl, aber das ist meistens um den Partitionswert zu ändern NICHT den Schlüssel aus dem Verzeichnisnamen zu entfernen - es wird die Metadaten des Stockwerks durcheinander bringen - Ich rate dringend, es NICHT zu experimentieren!Ich weiß, es wird nie funktionieren, aber hier ist ein Befehl - 'ALTER TABLE Tabellenname [Partition Partition_Spec] SET LOCATION" neue Position ";' –