Как рекурсивно загрузить несколько таблиц CSV в один каталог в Hive

Я создал внешнюю таблицу Hive с указанной схемой, но без данных, скажем, таблицы A. Теперь предположим, что у меня есть файлы CSV в каталоге HDFS, организованные следующим образом:

20150718/dir1/dir2/file1.csv
20150718/dir1/dir2/file2.csv
...................
20150718/dir1/dir2/..../dirN/file10000.csv

Другими словами, файлы могут находиться в нескольких каталогах разных уровней в каталоге 20150718. Как загрузить эти CSV-файлы одной командой Hive / shell?

Еще одно замечание: я планирую создавать разделы на основе даты по мере того, как время идет, как мне тогда действовать? Все еще новый пользователь Hive, мы ценим совет.


person Jin    schedule 23.07.2015    source источник


Ответы (1)


// Получаем конфигурацию

Configuration conf = getConf();
FileSystem fs = inputPath.getFileSystem(conf);

// Укажите фильтр, даты в вашем случае.

PathFilter pf = new FileFilter(conf, fs, new String[] { "txt" });

// Рекурсивное перемещение или копирование

moveRecursivelytoTarget(target, fs, inputPath, pf);

protected void moveRecursivelytoTarget(String target, FileSystem fs, Path path, PathFilter inputFilter)
    throws IOException
  {
    for (FileStatus stat : fs.listStatus(path, inputFilter))
      if (stat.isDir())
        moveRecursivelytoTarget(target, fs, stat.getPath(), inputFilter);
      else
      {
        fs.copyFromLocalFile(stat.getPath(), target);
        //Or rename
        //rename(stat.getPath(), target) 
      }
 }

вы можете выполнить ту же процедуру и в оболочке.

Для создания динамического раздела поместите собранную выше информацию в промежуточную таблицу, назовите ее tableA, затем прочтите из tableA и запишите в tableMain с помощью parttion, и вы можете очистить tableA в течение дня.

set hive.exec.dynamic.partition=true; 
INSERT OVERWRITE TABLE tableMain PARTITION (date) SELECT x,y,z 
FROM tableA t;
person rbyndoor    schedule 23.07.2015