shell—如何在一个目录中将多个csv表递归地加载到配置单元中

ktca8awb  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(232)

我创建了一个带有指定模式但没有数据的外部配置单元表,比如表a。现在让我们假设hdfs dir中的csv文件按以下方式组织:

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

换句话说,这些文件可能位于dir20150718中的多个不同级别的dir中。如何在一个hive/shell命令中加载这些csv文件?
另一个注意事项是,随着时间的推移,我计划根据日期创建分区,那么我应该如何继续?仍然是一个新的Hive用户,建议是感激的。

z4bn682m

z4bn682m1#

//获取配置

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) 
      }
 }

您也可以在shell中执行相同的过程。
为了创建动态分区,将上面收集的信息放入一个临时表中,将其称为tablea,然后用parttion从tablea读取并写入tablemain,您就可以清理这个表一天。

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

相关问题