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-файл — Как это работает — Как получить метаданные), потому что ответ говорит мне использовать «Hive», и я уже использую HiveContext следующим образом:

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

Кстати, я использую свой собственный файл hive-site.xml, который содержит следующее:

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

person DilTeam    schedule 02.08.2016    source источник
comment
Возможный дубликат файла ORC Hadoop - Как это работает - Как для получения метаданных   -  person zero323    schedule 02.08.2016
comment
Я уже читал это, но там написано... Используйте Hive и/или HCatalog для создания, чтения..... Но я использую HiveContext для чтения. Итак, как этот ответ поможет мне? Пожалуйста, объясни.   -  person DilTeam    schedule 02.08.2016
comment
Поскольку схема хранится в хранилище метаданных, это, скорее всего, означает, что вы не используете одно и то же хранилище метаданных для обеих операций, верно?   -  person zero323    schedule 02.08.2016
comment
Хорошая точка зрения. Но я использую свой собственный файл hive-site.xml (добавленный к описанию выше), в который я скопировал «hive.metastore.uris» из /etc/hive/conf/hive-site.xml.   -  person DilTeam    schedule 02.08.2016
comment
Я бы начал с двойной проверки правильности применения этой конфигурации. Вы также можете проверить каталог из Spark, чтобы узнать, доступны ли оттуда метаданные. Если это так, вы будете знать, где искать.   -  person zero323    schedule 02.08.2016
comment
Может быть связано с той же ошибкой Hive, которая мотивировала этот другой пост: stackoverflow.com/questions/38674623/   -  person Samson Scharfrichter    schedule 03.08.2016
comment
Похоже, та же проблема. Значит, мы должны использовать Hive 2.0?   -  person DilTeam    schedule 03.08.2016


Ответы (2)


Я понял, в чем проблема. Именно так я создавал тестовые данные. У меня сложилось впечатление, что если я выполню следующие команды:

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

person DilTeam    schedule 03.08.2016
comment
Привет @DilTeam, я столкнулся с той же проблемой, не могли бы вы поделиться, как вы создаете свои тестовые данные. Я не могу сохранить схему в выходном файле. - person AvneeshAtri; 02.11.2020

@DilTeam В этом проблема, когда вы записываете данные с помощью Hive (версия 1.x), он не сохраняет метаданные столбцов для файлов в формате orc (это не то же самое для паркета и т. Д.), Эта проблема исправлена ​​​​в новом Hive ( 2.x) для хранения информации о столбцах в метаданных, которые позволяют искре считывать метаданные из самого файла. Вот еще один вариант загрузки таблиц, написанных с помощью Hive1, в spark:

val table = spark.table(<db.tablename>)

Здесь spark — это sparkSession по умолчанию, который извлекает информацию таблицы из хранилища метаданных куста.

Еще один вариант поставляется с дополнительным кодовым блоком и необходимой информацией:

Создайте кадр данных с определенной схемой поверх извлеченного RDD, это даст вам гибкость для изменения типов данных, вы можете прочитать по этой ссылке

https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#programmatically-specifying-the-schema

Надеюсь, это поможет

person ShuBham ShaRma    schedule 27.12.2018