如何在 Hadoop 中的机器之间传输文件并使用 Pig 搜索字符串
Posted
技术标签:
【中文标题】如何在 Hadoop 中的机器之间传输文件并使用 Pig 搜索字符串【英文标题】:How to transfer files between machines in Hadoop and search for a string using Pig 【发布时间】:2012-03-16 22:36:42 【问题描述】:我有两个问题:
我有一个很大的记录文件,几百万条。我需要将此文件从一台机器传输到 hadoop 集群机器。我猜hadoop中没有scp命令(或者有吗?)如何将文件传输到hadoop机器?
此外,一旦文件在我的 hadoop 集群上,我想搜索包含特定字符串的记录,例如“XYZTechnologies”。这是猪怎么办?一些示例代码可以很好地给我一个良好的开端。
这是我第一次在 Hadoop/Pig 上工作。所以如果这是一个“太基本”的问题,请原谅我。
编辑 1
我尝试了 Jagaran 的建议,但出现以下错误:
2012-03-18 04:12:55,655 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1000: Error during parsing. Encountered " "(" "( "" at line 3, column 26.
Was expecting:
<QUOTEDSTRING> ...
另外,请注意,我想在记录中的任何位置搜索字符串,所以我将制表符分隔的记录作为一列读取:
A = load '/user/abc/part-00000' using PigStorage('\n') AS (Y:chararray);
【问题讨论】:
复制到 HDFS:***.com/q/1533330/179529。 Pig 不适合搜索。它用于扫描大量数据以进行操作 (ETL)。 【参考方案1】:对于您的第一个问题,我认为 Guy 已经回答了它。 至于第二个问题,如果您只想搜索包含特定字符串的记录,bash 脚本会更好,但如果您坚持使用 Pig,这就是我的建议:
A = load '/user/abc/' using PigStorage(',') AS (Y:chararray);
B = filter A by CONTAINS(A, 'XYZTechnologies');
store B into 'output' using PigStorage()
请记住,PigStorage 默认分隔符是制表符,因此请放置一个不会出现在文件中的分隔符。 那么你应该编写一个为 CONTAINS 返回布尔值的 UDF,类似于:
public class Contains extends EvalFunc<Boolean>
@Override
public Boolean exec(Tuple input) throws IOException
return input.get(0).toString().contains(input.get(1).toString());
我没有对此进行测试,但这是我会尝试的方向。
【讨论】:
【参考方案2】:用于复制到 Hadoop。 1.你可以在另一台机器上安装Hadoop Client然后做 hadoop dfs -copyFromLocal 从命令行 2. 你可以简单地编写一个java代码,使用FileSystem API复制到hadoop。
对于猪。 假设您知道字段 2 可能包含 XYZTechnologies
A = load '<input-hadoop-dir>' using PigStorage() as (X:chararray,Y:chararray);
-- There should not be "(" and ")" after 'matches'
B = Filter A by Y matches '.*XYZTechnologies.*';
STORE B into 'Hadoop=Path' using PigStorage();
【讨论】:
谢谢贾加兰。我尝试了您的建议,但在执行此操作时出现错误。我正在用 EDIT 1 更新问题。请看一看。再次感谢。 “匹配项”周围不应有 ()。休息很好。【参考方案3】:您好,您可以使用 hadoop grep 函数来查找文件中的特定字符串。 例如,我的文件包含如下一些数据
你好 xyz。我喜欢hadoop。 hadoop 很好。 我在练习。
所以 hadoop 命令是 hadoop fs -text '带路径的文件名' | grep '待查字符串'
猪壳: --将文件数据加载到pig变量中
**data = LOAD 'file with path' using PigStorage() as (text:chararray);
-- 找到需要的文字
txt = FILTER data by ($0 MATCHES '.待查字符串。');
--显示数据。
dump txt; ---或使用 Illustrate txt;
-- 将其存储在另一个文件中 使用 PigStorage() 将 txt 存储到“路径”中;
【讨论】:
以上是关于如何在 Hadoop 中的机器之间传输文件并使用 Pig 搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop MapReduce 流式传输 - 确保我已处理所有日志文件的最佳方法