如何在 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 搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章

两台Linux机器之间的Telnet文件传输[关闭]

Hadoop MapReduce 流式传输 - 确保我已处理所有日志文件的最佳方法

CentOS 配置集群机器之间SSH免密码登录

Monotorrent 传输文件

在PC中运行的IDE与后端UNIX机器中的代码之间的代码同步

从远程机器将文件放在 HDFS 上时如何指定用户名?