我正在使用Flink SQL处理Kafka流,其中从Kafka中提取所有消息,使用flink sql处理所有消息,然后将其推回到kafka中。我想要一个嵌套的输出,其中输入是平坦的,输出是嵌套的。假设我的输入是
{'StudentName':'ABC','StudentAge':33}
,并希望输出为
{'Student':{'Name':'ABC','Age':33}}
我尝试搜索here和一些相似的链接,但找不到。可以使用Apache Flink SQL API这样做吗?必要时可以使用用户定义的函数,但要避免这样做。
答案 0 :(得分:0)
您可以尝试这样的事情:
SELECT
MAP ['Student', MAP ['Name', StudentName, 'Age', StudentAge]]
FROM
students;
我找到了MAP函数here,但是我不得不尝试SQL Client来找出语法。
答案 1 :(得分:0)
我能够通过从Flink UDF返回一个映射来达到相同的目的。 UDF中的eval()函数将返回一个Map,而FlinkSQL查询将使用学生作为别名来调用UDF:
UDF应该看起来像这样
public class getStudent extends ScalarFunction {
public Map<String, String> eval(String name, Integer age) {
Map<String, String> student = new HashMap<>();
student.put("Name", name);
student.put("Age", age.toString());
return student;
}
}
和FlinkSQL查询保持如下:
Select getStudent(StudentName, StudentAge) as `Student` from MyKafkaTopic
尝试从FlinkSQL中获取列表时,也可以对列表执行同样的操作