2017-01-24 12 views
0

У меня есть n(large) количество файлов орков малого размера, которые я хочу объединить в k(small) количество больших файлов орков.Как работает табличка с таблицей <table name> concatenate?

Это делается с использованием команды alter table table_name concatenate в Улье.

Я хочу понять, как Уйв реализует это. Я ищу, чтобы реализовать это, используя Spark, с любыми изменениями, если это необходимо.

Любые указатели были бы замечательными.

ответ

1

Согласно AlterTable/PartitionConcatenate:

Если таблица или раздел содержит много мелких файлов конфигурации или ORC файлов, то вышеприведенная команда будет объединять их в более крупные файлы. В случае RCFile слияние происходит на уровне блока, тогда как для файлов ORC слияние происходит на уровне полосы, что позволяет избежать накладных расходов на декомпрессию и декодирование данных.

Также :

Тело ORC файлов состоит из ряда полос. Полосы: большие (обычно ~ 200 МБ) и независимы друг от друга и часто обрабатываются различными задачами. Определяющим признаком для форматов хранения столбцов является то, что данные для каждого столбца хранятся отдельно и что чтение данных из файла должно быть пропорционально количеству прочитанных столбцов . В файлах ORC каждый столбец хранится в нескольких потоках, которые хранятся рядом друг с другом в файле. Например, целочисленный столбец равен , представленному как два потока PRESENT, который использует один бит с записью значения , если значение не является нулевым, и DATA, который записывает ненулевые значения. Если все значения столбца в полосе не равны нулю, поток PRESENT не указан на полосе. Для двоичных данных ORC использует три потока PRESENT, DATA и LENGTH, которые сохраняют длину каждого значения. Детали каждого типа будут представлены в следующих статьях: .

Для реализации в Спарк вы можете использовать SparkSQL с помощью искрового Контекст:

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

scala> sqlContext.sql("Your_hive_query_here")