[英]Regex pattern to remove square brackets and commas in a json array in order to apply MapReduce
好吧,我基本上有一个像这样的JSON数组:
[
{
product:something,
version:something
},
{
product: something,
version: something
}
]
我需要删除每个json之间的逗号,就像花括号后的逗号一样,我也需要删除方括号。 这是必需的,因为我要逐元素反序列化,所以如果在它们之间有逗号或括号会给我一个错误,或者对我来说似乎是错误的。
无论如何,我一直试图创建一个正则表达式模式来替换那些元素。 例如,假设读取的第一个json像这样作为字符串:
[
{
product:something,
version:something
},
所以我的模式是这样的: [\\[\\]/}(?=,)]
但是,它匹配了最后一个括号和json内的所有逗号,这不是我所需要的。
有人可以帮我吗? 至少请我参考一些教程或其他内容?
编辑:我不能使用任何反序列化器或类似的东西,基本上,我将json数组的每个元素都读为一行,以“}”分隔。
找到了一种执行此操作的方法,在该方法中,我不需要涉及任何正则表达式或对JSON的更改。 无论如何,这是这样的:
首先转到这里https://gist.github.com/Lupus/9988093 ,获取您正在使用的任何API的WholeFileInput格式。 最后,这是我如何在一个映射器中实现它的示例:
package mapreduce;
import java.io.IOException;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Mapper;
import org.json.*;
public class CommonErrorsMapper extends Mapper<NullWritable, BytesWritable, TextTriplet, IntWritable> {
public void map(NullWritable key, BytesWritable value, Context context) throws IOException, InterruptedException{
String product;
String version;
String errorCode;
String json = new String(value.getBytes());
try {
JSONArray jObject = new JSONArray(json);
for(int i = 0; i < jObject.length(); i++){
product = jObject.getJSONObject(i).getString("product");
version = jObject.getJSONObject(i).getString("version");
errorCode = jObject.getJSONObject(i).getString("errorCode");
context.write(new TextTriplet(product, version, errorCode), new IntWritable(1));
}
}catch(Exception error){
error.printStackTrace();
}
}
}
离开这里,是因为我发现mapreduce难以理解,使用JSON之类的格式时更是如此。 因此,无论如何,这似乎就是它的全部,除非那是其他人找到了一种无需读取整个文件的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.