【问题标题】:Load multiple files with PigLatin (Hadoop)使用 PigLatin (Hadoop) 加载多个文件
【发布时间】:2023-03-28 12:55:02
【问题描述】:

我有一个相同格式的 csv 文件的 hdfs 文件列表。我需要能够LOAD他们和猪一起。例如:

/path/to/files/2013/01-01/qwe123.csv
/path/to/files/2013/01-01/asd123.csv
/path/to/files/2013/01-01/zxc321.csv
/path/to/files/2013/01-02/ert435.csv
/path/to/files/2013/01-02/fgh987.csv
/path/to/files/2013/01-03/vbn764.csv

由于它们的名称是“随机”散列并且它们的目录可能包含更多的 csv 文件,因此它们不能被地球化。

【问题讨论】:

标签: hadoop apache-pig


【解决方案1】:

正如其他 cmets 所建议的,您可以通过预处理文件来做到这一点。假设您的 HDFS 文件名为file_list.txt,那么您可以执行以下操作:

pig -param flist=`hdfs dfs -cat file_list.txt | awk 'BEGIN{ORS="";}{if (NR == 1) print; else print ","$0;}'` script.pig

awk 代码去掉了换行符并使用逗号分隔文件名。

在您的脚本中(在我的示例中称为script.pig),您应该使用参数替换来加载数据:

data = LOAD '$flist';

【讨论】:

  • 您知道如何转义分隔符吗?因为我的文件名似乎包含逗号 :(
【解决方案2】:

您不限于通配符。使用这个:

LOAD '/path/to/files/2013/01-{01/qwe123,01/asd123,01/zxc321,02/ert435,02/fgh987,03/vbn764}.csv';

【讨论】:

  • 解析文件名会是一种负担,但我也无法控制我在文件中获得的路径。他们可能会改变。
  • 构造一个类似{path1,path2,path3}的字符串并作为参数传入。
  • @Veseliq 运行一个 shell 脚本来 ls 你感兴趣的文件名,并将它们连接成一个字符串,就像上面提到的 winnie 一样。
猜你喜欢
  • 1970-01-01
  • 2013-10-07
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2016-03-07
相关资源
最近更新 更多