话不多说,直接上代码
数据样例:
{
"fileInfo": [
{
"fileId": 4169200573588,
"fileSize": 21.0,
"fileType": 5,
"md5": "B54FA0BB16D9D1180619FC5D4D653494"
},
"subjectMap": {
"1234": 0,
"4455": 4373
}
],
"serverIp": "10.101.0.1"
}
解析Array:
/**
* 解析数组类型数据,转成多行
*/
@FunctionHint(output = @DataTypeHint("ROW<fileId BIGINT,fileSize STRING,fileType INT,md5 STRING>"))
public class ParserJsonArray extends TableFunction<Row> {
private static final Logger LOG = LoggerFactory.getLogger(ParserJsonArray.class);
public void eval(String value) {
try {
JSONArray jsonArray = JSONArray.parseArray(value);
Iterator<Object> iterator = jsonArray.iterator();
while (iterator.hasNext()) {
JSONObject jsonObject = (JSONObject) iterator.next();
Long fileId = jsonObject.getLong("fileId");
String fileSize = jsonObject.getString("fileSize");
Integer fileType = jsonObject.getInteger("fileType");
String md5 = jsonObject.getString("md5");
collect(Row.of(fileId, fileSize,fileType,md5));
}
} catch (Exception e) {
LOG.error("parser json failed :" + e.getMessage());
}
}
}
解析Map:
/**
* 解析map类型数据,转成多行
*/
@FunctionHint(output = @DataTypeHint("Row< key STRING, value INT>"))
public class ParserMap extends TableFunction<Row> {
public void eval(Map<String, Integer> map) {
try {
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Integer value = map.get(key);
collect(Row.of(key, value));
}
} catch (Exception e) {
}
}
}
引用函数:
//引用自定义udf函数,解析map类型数据
tableEnv.createTemporaryFunction("parserMap", classOf[com.data.ParserMap])
//构建数据查询语句
var querySql =
"select key,valuie from " + table + " CROSS JOIN lateral TABLE (parserMap(subjectMap)) AS t (key,valuie)"
var queryTable = tableEnv.sqlQuery(querySql.stripMargin)
完成