Как получить имя входного файла в качестве столбца внутри запроса куста

У меня есть внешние таблицы, которые отображаются в какой-то каталог. Этот каталог содержит несколько файлов.

Я хочу запустить запрос, например, найти имя файла, где есть пользователь "abc"

 select file_name , usr from usrs_tables where usr = "abc"

Но, конечно, данные не включают имя файла внутри.

В MapReduce я могу сделать это с помощью

FileSplit fileSplit = (FileSplit)context.getInputSplit();
String filename = fileSplit.getPath().getName();
System.out.println("File name "+filename);
System.out.println("Directory and File name"+fileSplit.getPath().toString());

Как я могу сделать это в Hive?

Ответ 1

Да, вы можете получить файл, в котором была найдена запись, используя виртуальный столбец с именем INPUT__FILE__NAME, например:

select INPUT__FILE__NAME, id, name from users where ...;

дает что-то вроде:

hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users1.txt    2    user2
hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users2.txt    42    john.doe

При необходимости используйте предоставленные строковые функции, чтобы обрезать хост и каталоги из uri.

Здесь вы можете найти документацию по виртуальным столбцам: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

Ответ 2

Каждая таблица в Hive имеет два виртуальных столбца. Они

  • INPUT__FILE__NAME
  • BLOCK__OFFSET__INSIDE__FILE

INPUT__FILE__NAME указывает имя файла. BLOCK__OFFSET__INSIDE__FILE - текущая глобальная позиция файла. Предположим, хотим ли мы найти имя файла, соответствующего каждой записи в файле. Мы можем использовать столбец INPUT__FILE__NAME. Эта функция доступна из версий Hive выше 0,8. Ниже приведен небольшой пример.

Запрос

select INPUT__FILE__NAME, name from customer_data;

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

select distinct(INPUT__FILE__NAME) from customer_data;

Ответ 3

Hive 0.8.0 обеспечивает поддержку двух виртуальных столбцов:

Одним из них является INPUT__FILE__NAME, которое является именем входного файла для задачи сопоставления.

другой - BLOCK__OFFSET__INSIDE__FILE, который является текущей глобальной позицией файла.

Для файла, сжатого блоком, это текущее смещение файла блока, которое является текущим смещением файла первого байта блока.

После Hive 0.8.0 были добавлены следующие виртуальные столбцы:

  • ROW__OFFSET__INSIDE__BLOCK
  • RAW__DATA__SIZE
  • ROW__ID
  • GROUPING__ID

Обновлена ссылка на виртуальные столбцы в улье: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns