Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将非打印字符传递给Hadoop流分隔符的shell命令_Java_Shell_Hadoop Streaming - Fatal编程技术网

Java 将非打印字符传递给Hadoop流分隔符的shell命令

Java 将非打印字符传递给Hadoop流分隔符的shell命令,java,shell,hadoop-streaming,Java,Shell,Hadoop Streaming,我正在使用hadoop流,我想更改键和值之间的分隔符 我注意到我可以用这个参数来改变它 hadoop jar \ /opt/cloudera/parcels/CDH-5.1.0-1.cdh5.1.0.p0.53/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.3.0-mr1-cdh5.1.0.jar \ -D stream.map.output.field.separator=. \ ... 它将使用而不是\t作为新

我正在使用hadoop流,我想更改键和值之间的分隔符

我注意到我可以用这个参数来改变它

hadoop jar \
/opt/cloudera/parcels/CDH-5.1.0-1.cdh5.1.0.p0.53/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.3.0-mr1-cdh5.1.0.jar \
-D stream.map.output.field.separator=. \
...
它将使用
而不是
\t
作为新的分隔符


如何将非打印字符(如
^a
)发送到命令(标题开头),这是配置单元的默认分隔符

如果您谈论的是bash或其他常见的Linux shell,您可以通过在它前面加上ctrlV来输入任意字符。我会把它放在单引号中,只是为了确保shell不会以任何方式特别对待它。因此,它将类似于
stream.map.output.field.separator='^A'
,您可以通过键入ctrlV,然后键入ctrlA来生成
^A

请注意,shell将正确地传递它,但我不能保证Hadoop及其解析属性的方式

另一种方法是使用
sed
将输入文件的分隔符替换为选项卡

sed -e 's/^A/<tab>/g' <filename> | hadoop …
sed-e的/^A//g'| hadoop…

在这里,您将生成^A,其中ctrlV后跟ctrlA,ctrlV后跟tab或ctrlI。我将该
hadoop jar..
命令放入脚本中,并作为bash文件运行。我确实在那个脚本文件中输入了
^A
,但Hadoop似乎无法识别它。不确定这是否是Hadoop的一个限制,它无法识别这一点,或者。。这仍然不是正确的解决方案。您尝试过我的其他解决方案吗?要将输入文件的分隔符替换为制表符吗?我更喜欢使用
^A
的原因是,数据中存在制表符
\t
和大量其他常用的分隔符。如果我走那条路,它会污染某些记录。