我正在尝试使用以下代码将一段hadoop sequencefile转换为纯文本:
Configuration config = new Configuration();
Path path = new Path( inputPath );
SequenceFile.Reader reader = new SequenceFile.Reader(FileSystem.get(config), path, config);
WritableComparable key = (WritableComparable) reader.getKeyClass().newInstance();
Writable value = (Writable) reader.getValueClass().newInstance();
File output = new File(outputPath);
if(!output.exists()) output.createNewFile();
FileOutputStream fos = new FileOutputStream(output);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"));
int count = 0;
try {
while(reader.next(key,value) && count < 1000)
{
bw.write("Key::: " + key);
bw.newLine();
bw.write("Value::: " + value);
bw.newLine();
bw.newLine();
count++;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
reader.close();
bw.close();
钥匙可以正确地转换。但是,这些值被转换成十六进制数流。示例是:
Value::: 1f 8b 08 00 00 00 00 00 00 03 e5 bd f9 7b 13 47 d6 28 fc 73 e6 79 e6 7f e8 28 17 6c 5f bc 68 5f 6c e4 5c 96 64 26 33 c9 24 37 cb bc ef 3b 0c 9f 9f 56 77 cb ee 58 96 34 5a 20 8e e3 3f 46 56 c2 10 30 c4 8b e4 4d 5e b1 6c 4b f2 22 59 b2 65 63 48 08 04 42 12 c2 9e 00 21 cb f3 9d 53 d5 2d b5 64 4b 16 33
真正的溪流比这要长得多。我所知道的是,这些钥匙被储存为 Hadoop Text
格式和值存储为 Hadoop BytesWritable
. 这些值可能是中文的,但我不确定。
有人知道发生了什么事吗?
1条答案
按热度按时间w8rqjzmb1#
你说这些值存储为
BytesWritable
. Map到byte[]
在java中,一个字节数组——这正是要打印的内容,因为toString()
方法重载以执行此操作。您还提到字节可能是中文文本。如果您想输出它,您需要将字节编码为
String
. 你应该换条线给其他几个人。
这假设中文字符串使用“utf-8”编码,现在可能是这样。你必须尝试不同的编码,看看如果你不知道确切的一个工作。