0

我想从我的 map reduce 作业中读取托管 Hive 表数据。我有一个托管 Hive 表,它是从另一个表创建的,该表是从外部配置单元表创建的。我想在我的最终托管 Hive 表上运行 map reduce 作业。我读到托管表有一个分隔符,默认为“char 1”ASCII 字符。所以我这样做了:

public static final String SEPARATOR_FIELD = new String(new char[] {1});

后来我在一个循环中做了这个:

end = rowTextObject.find(SEPARATOR_FIELD, start);

但是当我运行 map reduce jar 时,我在上面的行和下面给出的行中得到 Illegal Argument 异常:

public void map(LongWritable key, Text rowTextObject, Context context) throws IOException, InterruptedException

PS:我在 github 上查找了一个项目,用于在 mapreduce 作业中读取托管配置单元表,但我无法理解 @ https://github.com/facebook/hive-io-experimental

4

1 回答 1

0

假设我有如下输入文件(比如 xyz.txt):-
111 \001 222
121 \001 222
131 \001 222
141 \001 222
151 \001 222
161 \001 222
171 \001 222
现在\001是我的蜂巢默认分隔符(比如说)。
现在为了解析这个已经使用 map reduce 加载到 hive 表的文件,我将在我的 map 方法中执行类似的操作:-

public class MyMapper extends Mapper<LongWritable, Text, Text, Text>{
    public void map(LongWritable key, Text value,Context context) throws java.io.IOException ,InterruptedException
    {

        String[]vals=value.toString().split("\\001");
        context.write(new Text(vals[0]),new Text("1"));
     }

}

您的驱动程序方法将是正常的,如下所示:-

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setMapperClass(MyMapper.class);
FileInputFormat.addInputPath(job, new Path(xyz.txt));

因此,根据我给出的 map 方法,最终输出将如下所示:-
111 1
121 1
131 1
141 1
151 1
161 1
171 1
这就是您正在寻找的,就像我在我的 map 方法中所做的解析一样?

于 2013-07-26T08:32:50.607 回答