2016-08-02 65 views
3

的模式當我運行以下:HiveContext未讀取Orcfile

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

的列印刷作爲「_col0」,「_col1」,「_col2」等。作爲反對他們的真實姓名,例如'empno','name','deptno'。

當我在Hive中描述mytable時,它會正確輸出列名,但是當我運行'orcfilingump'時,它也會顯示_col0,_col1,_col2。我必須指定'讀取模式'還是其他?如果是的話,我該如何在Spark/Scala中做到這一點?

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

注:我創建的表如下:

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

注:這是不是這個問題(Hadoop ORC file - How it works - How to fetch metadata)因爲答案告訴我使用「蜂巢」 &我已經的副本使用HiveContext如下:

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

順便說一句,我用我自己的蜂房的site.xml,它包含以下內容:

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

可能重複的[Hadoop ORC文件 - 它如何工作 - 如何獲取元數據](http://stackoverflow.com/questions/30094604/hadoop- orc-file-how-it-works-how-to-fetch-metadata) – zero323

+0

我已經閱讀過它,但它說..「使用Hive和/或HCatalog創建,讀取....」。但是我使用HiveContext來讀取。那麼這個答案如何幫助我?請解釋。 – DilTeam

+0

由於模式存儲在Metastore中,它很可能意味着您不會對兩種操作使用相同的Metastore,對嗎? – zero323

回答

0

我想出了問題所在。這是我創建測試數據的方式。我的印象是,如果我運行以下命令:

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); 

數據將在ORC格式的創建:/apps/hive/warehouse/mydb.db/mytable1

原來事實並非如此。儘管我表示'存儲爲orc',但INSERT語句並未保存列信息。不知道這是否是預期的行爲。無論如何,它現在都可以運作。道歉的混淆,但希望這將有助於未來的人 - :)