2016-08-02 26 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语句并未保存列信息。不知道这是否是预期的行为。无论如何,它现在都可以运作。道歉的混淆,但希望这将有助于未来的人 - :)