2016-08-02 7 views
3

Когда я запускаю следующее:HiveContext не читает схемы из Orcfile

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

Столбцы печатаются как «_col0», «_col1», «_col2» и т.д. В отличие от своих реальных имен, таких как 'empno', 'name', 'deptno'.

Когда я описываю mytable 'в Hive, он правильно печатает имя столбца, но когда я запускаю' orcfiledump ', он также показывает _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

Поскольку схема хранится в метасторе, это скорее всего означает, что вы не используете один и тот же метастор для обеих операций, правильно? – 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 не сохраняли информацию о столбцах. Не уверен, что это ожидаемое поведение. В любом случае все работает сейчас. Извинения за путаницу, но, надеюсь, это поможет кому-то в будущем - :)