Как работает Hive "изменить таблицу <имя таблицы> конкатенация"?

Я имею n(large) количество небольших файлов орков, которые я хочу объединить k(small) количество больших файлов орков.

Это сделано с помощью alter table table_name concatenate команда в улье.

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

Любые указатели были бы великолепны.

2 ответа

Обратите внимание, что в SparkSQL есть ряд Hive SQL, командкоторые не поддерживаются .

ALTER TABLE <tableIdentifier> [partitionSpec] CONCATENATE находится в этом списке и был от Spark 1, 2 до 3. Скорее всего, он не будет поддерживаться Spark до того дня, когда экосистема Hadoop отправит Hive со Spark в качестве механизма по умолчанию, и даже тогда это может стать устаревшим.

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

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

Также ORC Stripes:

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

Для реализации в Spark вы можете использовать SparkSQL с помощью Spark Context:

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

scala> sqlContext.sql("Your_hive_query_here")
Другие вопросы по тегам