对于系统的默认分割符,在MapReduce中的识别与本地的显示存在转码问题。
输入给sys.stdin的是hsql中select出来结果写入hdfs的数据,如果抽取部分数据到本地测试用个下面\t分割能很好分割select出来的数据,但是一旦提交hadoop的MapReduce服务器处理就报错。
for line in sys.stdin:
json_dict1 = {}
data=line.strip()
data_list = data.split('\t')
原因分析与解决:
上面在本地可以运行,但是线上对于hivesql中选出来的数据,默认是以\001字符串 分割的,导出来select的结果到hdfs中后以hadoop fs -text去出来的结果看不到任何分割符。某些软件中或命令中看到以^A分割的(即把hive表格导出到本地时,系统默认的分隔符是^A(以\001,\002...\025分割的,看到^A(^B)不一定第真正的字符,而是某个特殊字符,转换成二进制码之后可以看到真正字符的二进制码(比如\001,(\002)).对于这类特殊字符,直接用pycharm编辑器看或者cat或者vim是看不到的^A,看到的只是空格,(但是实际是在hives以\001处理的),所以对于在MapReducer中处理时要以 data_list = data.split('\001')来处理。(但是在导出到本地hive -e "select* ">结果文件,重定向后的结果文件,用\t分割是可以分割出的,且用\001反而分割不出!!!在hive sql(MapReducer中是要以字符串\001去分割!)
解决:data_list = data.split('\001') #线上需要用\001去分割。