Как работает 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")