繁体   English   中英

Apache Flink:不能将writeAsCsv()与子类元组的数据流一起使用

[英]Apache Flink: can't use writeAsCsv() with a datastream of subclass tuple

如此处推荐: 最佳实践-命名大型TupleX类型 我在数据流中使用的是POJO而不是元组。

这就是我的POJO的定义方式:

public class PositionEvent extends Tuple8<Integer, String, Integer, 
    Integer, Integer, Integer, Integer, Integer>

如果我尝试将PositionEvent的数据流保存到csv文件中,则会引发异常:

source.filter((PositionEvent e) -> e.speed > MAXIMUM_SPEED)
            .writeAsCsv(String.format("%s/%s", outputFolder, SPEED_RADAR_FILE))

线程“主”中的异常java.lang.IllegalArgumentException:writeAsCsv()方法只能在元组的数据流上使用。

但是,如果我将PositionEvent明确地强制转换为Tuple8,它将起作用:

source.filter((PositionEvent e) -> e.speed > MAXIMUM_SPEED)
            .map((PositionEvent e) ->
                    (Tuple8<Integer, String, Integer, Integer,
                            Integer, Integer, Integer, Integer>) e)
            .writeAsCsv(String.format("%s/%s", outputFolder, SPEED_RADAR_FILE))

Flink是否不应检测到数据流中的对象属于Tuple子类?

====================

编辑:(感谢twalthr)

好的,这是我现在的POJO:

import org.apache.flink.api.java.tuple.Tuple8;

public class PositionEvent extends Tuple8<Integer, String, Integer,
        Integer, Integer, Integer, Integer, Integer> {

    public PositionEvent() {
    }

    public PositionEvent(int timestamp, String vid, int speed, int xway,
                         int lane, int dir, int seg, int pos) {
        super(timestamp, vid, speed, xway, lane, dir, seg, pos);
    }

    public int getSpeed() {
        return f2;
    }
}

这是我以前的POJO:

public class PositionEvent extends Tuple8<Integer, String, Integer,
        Integer, Integer, Integer, Integer, Integer> {

    public int timestamp;

    public String vid;

    public int speed;

    public int xway;

    public int lane;

    public int dir;

    public int seg;

    public int pos;

    public PositionEvent() {
    }

    public PositionEvent(int timestamp, String vid, int speed, int xway,
                         int lane, int dir, int seg, int pos) {
        super(timestamp, vid, speed, xway, lane, dir, seg, pos);
    }
}

现在,我不需要显式转换POJO。

看来您不仅扩展了Tuple8而且还添加了其他字段,例如e.speed 这隐式地使您的类型成为POJO。 为了命名字段并保持有效的元组类型,您可以简单地实现getter而不添加其他字段。 否则,您可以简单地使用POJO而不是元组。

也许还值得研究Flink的Table&SQL API 它旨在通过自动处理所有类型来简化开发。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM