Flink的嵌套输出

时间:2019-01-04 12:33:25

标签: apache-kafka apache-flink flink-streaming flink-sql

我正在使用Flink SQL处理Kafka流,其中从Kafka中提取所有消息,使用flink sql处理所有消息,然后将其推回到kafka中。我想要一个嵌套的输出,其中输入是平坦的,输出是嵌套的。假设我的输入是

{'StudentName':'ABC','StudentAge':33}

,并希望输出为

{'Student':{'Name':'ABC','Age':33}}

我尝试搜索here和一些相似的链接,但找不到。可以使用Apache Flink SQL API这样做吗?必要时可以使用用户定义的函数,但要避免这样做。

2 个答案:

答案 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中获取列表时,也可以对列表执行同样的操作