Hadoop Streaming场景下如何去除输出结果末尾的制表符?
去除Hadoop Streaming输出结果末尾制表符的方法
针对你当前的Hadoop Streaming任务,要去掉输出结果每行末尾的制表符,可以通过以下几种方式实现:
方法一:修改Mapper/Reducer为文本处理命令
直接替换cat为sed或awk命令,在输出时自动去除行尾的制表符:
使用sed命令的示例命令
hadoop jar \ /usr/hdp/3.1.0.0-78/hadoop-mapreduce/hadoop-streaming.jar \ -Dmapred.reduce.tasks=1 \ -Dmapred.job.queue.name=default \ -input hdfs://yyclusterxx/hive_warehouse/xx.db/tab/dt=2023-01-03 \ -output hdfs://yyclusterxx/hive_warehouse/xx.db/tab/dt=2023-01-03-test5 \ -mapper "sed 's/\t$//'" \ -reducer "sed 's/\t$//'"
sed 's/\t$//'的作用是精准匹配每行末尾的制表符,并将其替换为空内容。
使用awk命令的示例命令
hadoop jar \ /usr/hdp/3.1.0.0-78/hadoop-mapreduce/hadoop-streaming.jar \ -Dmapred.reduce.tasks=1 \ -Dmapred.job.queue.name=default \ -input hdfs://yyclusterxx/hive_warehouse/xx.db/tab/dt=2023-01-03 \ -output hdfs://yyclusterxx/hive_warehouse/xx.db/tab/dt=2023-01-03-test5 \ -mapper "awk '{sub(/\t$/,"");print}'" \ -reducer "awk '{sub(/\t$/,"");print}'"
awk '{sub(/\t$/,"");print}'会定位每行末尾的制表符并删除,再输出处理后的完整行内容。
方法二:针对键值对输出的特殊处理(若适用)
如果你的任务实际是输出键值对(而非单纯复制输入),Hadoop Streaming默认会用制表符分隔键和值。若要避免末尾出现多余制表符,可以通过配置参数修改输出分隔符:
hadoop jar \ /usr/hdp/3.1.0.0-78/hadoop-mapreduce/hadoop-streaming.jar \ -Dmapred.reduce.tasks=1 \ -Dmapred.job.queue.name=default \ -Dmapred.textoutputformat.separator= \ # 设置为空分隔符 -input hdfs://yyclusterxx/hive_warehouse/xx.db/tab/dt=2023-01-03 \ -output hdfs://yyclusterxx/hive_warehouse/xx.db/tab/dt=2023-01-03-test5 \ -mapper cat \ -reducer cat
注意:此方法仅适用于键值对输出场景,若你的任务是直接复制输入内容,建议优先使用方法一。
内容的提问来源于stack exchange,提问作者rui liang
相关产品推荐
相关产品推荐

