问题描述
写UDF函数去解析ods层数据进dwd层是出现的错误:
java.lang.ArrayIndexOutOfBoundsException: 123
at com.alibaba.fastjson2.JSONReader.char4(JSONReader.java:331)
at com.alibaba.fastjson2.JSONReaderUTF16.readString(JSONReaderUTF16.java:3673)
at com.alibaba.fastjson2.JSONReader.readObject(JSONReader.java:1662)
at com.alibaba.fastjson2.JSONReader.read(JSONReader.java:1489)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:176)
at UdfParseProcessesToMap.evaluate(UdfParseProcessesToMap.java:13)
at com.aliyun.odps.udf.impl.batch.UdfEvaleb09256151d84d56bee374c0595443ff.evaluate(Unknown Source)
at com.aliyun.odps.udf.impl.batch.UDFZeroCopyEvaluatorForEE.batchProcess(UDFZeroCopyEvaluatorForEE.java:175)
原因分析:
出现下面情况时转json就会出现上述异常:
- 字段里面包含特殊字符 例如:\u00A0\u00A0\u00A0
- 字段里面包含双斜杠 \\ 或者其他特殊字符
解决方案:
-
针对1的话,可以升级fastJson依赖版本(1.1.39以及1.1.39以下版本) 确实有部分特殊字符未做处理。
-
针对2的话,可以使用正则把特殊字符替换
replaceAll("\\\\", "/");
或者
先replaceAll("\\\\", "@@@");
处理完后再replaceAll("@@@@", "\\\\");