Прочитать файл, который добавлен в ресурс Hive, с помощью Добавить файл из UDF - PullRequest
0 голосов
/ 26 августа 2018

Я хотел бы знать, как я могу прочитать ресурсы Hive, добавленные с помощью ADD FILE из Udf?Например,

Hive > add file /users/temp/key.jks

Можно ли прочитать этот файл в UDF на Java?Каким будет путь для получения этого файла в Udf?

Спасибо, Дэвид

1 Ответ

0 голосов
/ 26 августа 2018

Как только ресурс добавляется в сеанс с помощью команды ADD, запросы Hive могут ссылаться на него по его имени (в предложениях map / проводить / преобразовывать), и ресурс доступен локально во время выполнения во всем кластере Hadoop.Hive использует распределенный кэш Hadoop для распределения добавленных ресурсов по всем машинам в кластере во время выполнения запроса.Смотрите здесь: HiveResources

В Hive есть функция in_file(string str, string filename) - возвращает true, если строка str отображается как целая строка в имени файла.Вы можете использовать исходный код in_file в качестве примера: GenericUDFInFile.java

Несколько методов из исходного кода:

  private BufferedReader getReaderFor(String filePath) throws HiveException {
    try {
      Path fullFilePath = FileSystems.getDefault().getPath(filePath);
      Path fileName = fullFilePath.getFileName();
      if (Files.exists(fileName)) {
        return Files.newBufferedReader(fileName, Charset.defaultCharset());
      }
      else
      if (Files.exists(fullFilePath)) {
        return Files.newBufferedReader(fullFilePath, Charset.defaultCharset());
      }
      else {
        throw new HiveException("Could not find \"" + fileName + "\" or \"" + fullFilePath + "\" in IN_FILE() UDF.");
      }
    }
    catch(IOException exception) {
      throw new HiveException(exception);
    }
  }

  private void loadFromFile(String filePath) throws HiveException {
    set = new HashSet<String>();
    BufferedReader reader = getReaderFor(filePath);
    try {
      String line;
      while((line = reader.readLine()) != null) {
        set.add(line);
      }
    } catch (Exception e) {
      throw new HiveException(e);
    }
    finally {
      IOUtils.closeStream(reader);
    }
}
...