Spark SQL в файлах ORC не возвращает правильную схему (имена столбцов)

У меня есть каталог, содержащий файлы ORC. Я создаю DataFrame, используя приведенный ниже код

var data = sqlContext.sql("SELECT * FROM orc.`/directory/containing/orc/files`");

Он возвращает фрейм данных с этой схемой

[_col0: int, _col1: bigint]

Где, как ожидается, схема

[scan_nbr: int, visit_nbr: bigint]

Когда я запрашиваю файлы в формате паркета, я получаю правильную схему.

Мне не хватает каких-либо конфигураций?

Добавление дополнительных сведений

Это Hortonworks Distribution HDP 2.4.2 (Spark 1.6.1, Hadoop 2.7.1, Hive 1.2.1)

Мы не меняли конфигурации HDP по умолчанию, но это определенно не то же самое, что обычная ванильная версия Hadoop.

Данные записываются вышестоящими заданиями Hive, простым CTAS (CREATE TABLE sample STORED AS ORC as SELECT ...).

Я тестировал это на поле, созданном CTAS с последней версией 2.0.0, и оно сохраняет имена столбцов в файлах орков.


person Ramu Malur    schedule 30.07.2016    source источник
comment
У меня отлично работает. Можете добавить детали? Конфигурация, версии, как вы сохранили данные ...   -  person zero323    schedule 30.07.2016
comment
Добавлены подробности   -  person Ramu Malur    schedule 30.07.2016
comment
Мои 2 цента: убедитесь, что все файлы имеют одинаковую схему; поскольку Hive хранит теоретические имена столбцов в своем MetaStore, он может игнорировать расхождения; но поскольку вам требуется, чтобы Spark открывал файлы напрямую, если в этих файлах отображаются разные имена столбцов, он может вернуться к номерам столбцов ... см. cwiki.apache.org/confluence/display/Hive/   -  person Samson Scharfrichter    schedule 30.07.2016
comment
@SamsonScharfrichter, глядя на дамп файла orc, ясно, что имена столбцов в файле хранятся как _col0, _col1. Вышестоящее задание куста, которое создает эти файлы, является оператором CTAS. Нужно ли нам передавать какие-либо дополнительные конфигурации в Hive при их создании?   -  person Ramu Malur    schedule 31.07.2016
comment
@SamsonScharfrichter Спасибо за указатель на дамп орочьего файла. Это помогло мне определить основную причину.   -  person Ramu Malur    schedule 31.07.2016
comment
@RamuMalur, вы должны были указать в ответе Корневую причину.   -  person Dev    schedule 07.10.2016
comment
@dev ツ Я его изменил. Спасибо, что дал мне знать.   -  person Ramu Malur    schedule 10.10.2016


Ответы (5)



Параметр

sqlContext.setConf('spark.sql.hive.convertMetastoreOrc', 'false')

исправляет это.

person Tonci    schedule 17.05.2018

Если у вас также есть паркетная версия, вы можете просто скопировать имена столбцов, что я и сделал (также, столбец даты был ключом раздела для orc, поэтому пришлось переместить его в конец):

tx = sqlContext.table("tx_parquet")
df = sqlContext.table("tx_orc")
tx_cols = tx.schema.names
tx_cols.remove('started_at_date')
tx_cols.append('started_at_date') #move it to end
#fix column names for orc
oldColumns = df.schema.names
newColumns = tx_cols
df = functools.reduce(
    lambda df, idx: df.withColumnRenamed(
        oldColumns[idx], newColumns[idx]), range(
            len(oldColumns)), df)
person ski_squaw    schedule 02.03.2017

Мы можем использовать:

val df = hiveContext.read.table("tableName")

Ваш df.schema или df.columns даст фактические имена столбцов.

person Karthik K    schedule 10.08.2017

Если обновление версии недоступно, быстрое решение может заключаться в перезаписи файла ORC с помощью PIG. Кажется, это работает нормально.

person Saabu1210    schedule 20.04.2017
comment
Я не понимаю, как это отвечает на вопрос. - person GhostCat; 20.04.2017