基于需求,自己写了一个Flume的Interceptor,主要需求如下:
kafka中数据格式为json字符串,需要利用Flume消费kafka中的数据,并按照指定的key的顺序,将value输出,并用指定分隔符分隔
输入:String JsonString = "{'key1':'a','key2':'b','key3':'c','key4':'d','key5':'e','key6':'f'}";
指定的key的顺序:String[] keys = {"key1","key2","key3","key4","key5","key6"};
输出:a\u0001b\u0001c\u0001d\u0001e\u0001f
具体实现代码如下:
1、Interceptor代码:
package com.bonc.flumeInterceptor;
import java.util.HashMap;
import java.util.List;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import com.bonc.utils.Json2Map;
import com.bonc.utils.StringUnicodeUtil;
import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
/**
*
* @author pengzhe
* 自定义的一个flume拦截器,用来将json字符串转化成map,再按照指定顺序将map中的value按照指定格式输出
* 例子:
* String[] keys = {"key1","key2","key3","key4","key5","key6"};
输入:String JsonString = "{'key1':'a','key2':'b','key3':'c','key4':'d','key5':'e','key6':'f'}";
输出:a\u0001b\u0001c\u0001d\u0001e\u0001f
*
*/
public class FlumeJsonInterceptor implements Interceptor{
@Override
public void close() {
}
@Override
public void initialize() {
}
@Override
public Event intercept(Event event) {
//以keys数组中的元素顺序,输出jsonMap中对应key的value的值
String[] keys = {"key1","key2","key3","key4","key5","key6"};
String JsonString = new String(event.getBody(),Charsets.UTF_8);
//将jsonString转化为jsonMap
HashMap jsonMap = (HashMap) Json2Map.json2Map(JsonString);
System.out.println(jsonMap);
//将\u0001转化成字符串,用于拼接
String separatorStr = StringUnicodeUtil.unicode2Stri