【问题标题】:How to transfer files between machines in Hadoop and search for a string using Pig如何在 Hadoop 中的机器之间传输文件并使用 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);

【问题讨论】:

标签: hadoop mapreduce apache-pig hdfs


【解决方案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 存储到“路径”中;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2016-01-08
      • 2010-11-26
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多