2016-08-02 18 views
3

Wenn ich laufen die folgenden:HiveContext liest nicht Schema einer Orcfile

val df1 = sqlContext.read.format("orc").load(myPath) 
df1.columns.map(m => println(m)) 

Die Säulen werden als ‚_col0‘ gedruckt ‚_col1‘, ‚_col2‘ usw. In Bezug auf ihre wirklichen Namen gegen wie 'empno', 'name', 'deptno'.

Wenn ich 'mistable' in Hive beschreibe, druckt es den Spaltennamen korrekt, aber wenn ich 'orcfiledump' ausführe, zeigt es auch _col0, _col1, _col2. Muss ich "Schema beim Lesen" oder etwas spezifizieren? Wenn ja, wie mache ich das in Spark/Scala?

hive --orcfiledump /apps/hive/warehouse/mydb.db/mytable1 
..... 
fieldNames: "_col0" 
fieldNames: "_col1" 
fieldNames: "_col2" 

Hinweis: habe ich die Tabelle wie folgt:

create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc; 

Hinweis: Dies ist kein Duplikat dieser Frage ist (Hadoop ORC file - How it works - How to fetch metadata), weil die Antwort mir sagt ‚Hive‘ zu verwenden & Ich bin schon HiveContext wie folgt verwendet:

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) 

By the way, ich bin meine eigene hive-site.xml verwenden, die folgendes enthält:

<configuration> 
    <property> 
     <name>hive.metastore.uris</name> 
     <value>thrift://sandbox.hortonworks.com:9083</value> 
    </property> 
</configuration> 
+1

Mögliche Duplikate von [Hadoop ORC-Datei - Wie es funktioniert - Wie man Metadaten holt] (http://stackoverflow.com/questions/30094604/hadoop- orc-Datei-wie-es-funktioniert-wie-zu-holen-Metadaten) – zero323

+0

Ich lese dies bereits, aber es sagt .. "Verwenden Sie Hive und/oder HCatalog zum Erstellen, Lesen ....". Aber ich benutze einen HiveContext zum Lesen. Wie hilft mir diese Antwort? Bitte erkläre. – DilTeam

+0

Da das Schema in metasore gespeichert ist, bedeutet es wahrscheinlich, dass Sie nicht den gleichen Metastore für beide Operationen verwenden, richtig? – zero323

Antwort

0

Ich habe herausgefunden, was das Problem war. So habe ich die Testdaten erstellt. Ich hatte den Eindruck, dass, wenn ich die folgenden Befehle ausführen:

create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc; 

INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (1, 'EMP1', 100); 
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (2, 'EMP2', 50); 
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (3, 'EMP3', 200); 

Daten an im ORC-Format erstellt werden würde: /apps/hive/warehouse/mydb.db/mytable1

stellte sich heraus, das ist nicht der Fall. Obwohl ich "als Ork gespeichert" angegeben habe, haben die INSERT-Anweisungen die Spalteninformationen nicht gespeichert. Nicht sicher, ob das erwartetes Verhalten ist. Auf jeden Fall funktioniert alles jetzt. Entschuldigung für die Verwirrung, aber hoffentlich hilft das jemandem in Zukunft - :)