textoputformat.separator使用ctrla(^a)

i7uaboj4  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(382)

我正在尝试使用^a作为reduce输出文件中键和值之间的分隔符。我发现配置设置“mapred.textoutputformat.separator”正是我想要的,这将正确地将分隔符切换为“,”:

conf.set("mapred.textoutputformat.separator", ",");

但它不能处理^a字符:

conf.set("mapred.textoutputformat.separator", "\u0001");

抛出此错误: ERROR security.UserGroupInformation: PriviledgedActionException as:user (auth:SIMPLE) cause:org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.lang.RuntimeException: org.xml.sax.SAXParseException; lineNumber: 68; columnNumber: 94; Character reference "&# 我找到了这张票https://issues.apache.org/jira/browse/hadoop-7542 看到他们试图解决这个问题,但由于xml1.1的问题恢复了补丁。
因此,我想知道是否有人成功地使用简单的方法将分隔符设置为^a(似乎很常见)。或者我应该用制表符分隔。
谢谢!
我正在centos 6.2上运行hadoop 0.20.2-cdh3u5

ebdffaop

ebdffaop1#

环顾四周,我发现可能有三种方法可以解决这个问题:
字符引用“&#1”是无效的xml字符-与此问题类似
unicode字符/ctrl g或ctrl a作为textoutputformat(hadoop)分隔符
上述链接中详细说明的可能解决方案有:
可以对分隔符字符进行base64编码。然后,您需要创建一个自定义的textoutputformat来覆盖getrecordwriter方法并解码base64编码的分隔符。
再次创建自定义textoutputformat,除了更改选项卡中的默认分隔符。
通过xml资源文件提供分隔符。可以使用作业配置的addresource()方法指定自定义资源文件。

相关问题