当前位置: 首页 > 知识库问答 >
问题:

Apache Flink:“类X不包含字段Y的setter”是什么意思?

郭洋
2023-03-14

我第一次使用flink(1.6,1.7),并使用来自github存档的数据https://www.gharchive.org/但将该数据用作流数据源。

我的简单示例只是统计每天窗口中每个用户的所有事件,我尝试复制相同的示例,但使用TableEnvironment和SQL支持。

但是,我遇到了以下错误:

类org.apache.flink.streaming.api.functions.source.TimestamedFileInputSplit不包含字段修改时间的设置器,如下所示:

 8-12-04 14:17:02:115  INFO main exploration.StreamingTableApp:32 - Starting Streaming Table Flink App Example...
18-12-04 14:17:02:174  INFO main typeutils.TypeExtractor:1818 - class org.apache.flink.streaming.api.functions.source.TimestampedFileInputSplit does not contain a setter for field modificationTime
18-12-04 14:17:02:176  INFO main typeutils.TypeExtractor:1857 - Class class org.apache.flink.streaming.api.functions.source.TimestampedFileInputSplit cannot be used as a POJO type because not all fields are valid POJO fields, and must be processed as GenericType. Please read the Flink documentation on "Data Types & Serialization" for details of the effect on performance.
18-12-04 14:17:02:937  INFO main exploration.StreamingTableApp:74 - Finished...

我将CSV源读取为数据流,并使用Gson解析json行的位,并将这些属性映射到元组。

有人对此有什么想法/经验吗?

主要方法:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

// Mapped in docker compose file too.
DataStreamSource<String> input = env.readTextFile("/some/path/github/");

// Setup the stream
DataStream<Tuple4<String, Integer, String, Long>> stream = input.map(new GithubTupleConverter())
    .assignTimestampsAndWatermarks(new TupleTimestampExtractor());

StreamTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);
Table tableFromStream = tEnv.fromDataStream(stream, "user_id, kount, basic_date,event_date");

TupleTimestampExtractor

public class TupleTimestampExtractor
        extends BoundedOutOfOrdernessTimestampExtractor<Tuple4<String, Integer, String, Long>> {
    private static final long serialVersionUID = 3737675541965835242L;

    public TupleTimestampExtractor() {
        super(Time.seconds(30L));
    }

    @Override
    public long extractTimestamp(Tuple4<String, Integer, String, Long> element) {
        return element.getField(3);
    }
}

GithubTupleConverter。Java语言

public class GithubTupleConverter implements MapFunction<String, Tuple4<String, Integer, String, Long>> {

    private static final Gson g = new Gson();

    @Override
    public Tuple4<String, Integer, String, Long> map(String value) throws Exception {
        // Take each line as Json.
        JsonObject o = g.fromJson(value, JsonObject.class);

        // Extract the user id
        String userId = o.get("actor").getAsJsonObject().get("login").getAsString();

        // Extract the event type (commit, pull request, fork event)
        String type = o.get("type").getAsString();

        // Get the event date time
        String dateTime = o.get("created_at").getAsString();

        // Parse date string to Typed type.
        LocalDateTime eventTime = LocalDateTime.parse(dateTime, DateTimeFormatter.ISO_DATE_TIME);

        // Format the date so it can be used in the output.
        DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;

        return Tuple4.of(userId, 1, formatter.format(eventTime), eventTime.toInstant(ZoneOffset.UTC).toEpochMilli());
    }
} 

共有1个答案

壤驷鸿
2023-03-14

您共享的日志不显示错误。日志位于INFO级别,不会引发异常(至少在提供的日志中不会)。

日志条目只是说类TimestamedFileInputSplit不能被视为POJO。一般来说,此消息表明性能不是最佳的,但在这种特殊情况下,这不是问题。

您是否收到任何其他错误消息?

 类似资料:
  • 问题内容: 我正在调试一些JavaScript,无法解释它的作用? 有人可以给我一个提示,为什么这个人正在使用?我有时也看到它而没有声明。 问题答案: 这意味着该参数是可选的。因此,如果您不带任何参数调用该方法,则它将使用默认值。 它是写作的简写: 这种带有布尔表达式的速记技巧在Perl中也很常见。带有表达式: 它计算是否为或为。因此,如果为真,则完全不需要检查。这称为短路布尔评估,因此: 基本上

  • 问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,

  • 这个问题与Java表达式中子表达式的求值顺序不同,因为在这里肯定不是“子表达式”。需要加载它进行比较,而不是“求值”。这个问题是特定于Java的,表达式来自一个真实的项目,而不是通常为棘手的面试问题而设计的牵强附会的不切实际的构造。它应该是比较和替换习语的一行替换 它比x86 CMPXCHG指令还要简单,因此在Java中应该使用更短的表达式。

  • 问题内容: 我想找到一个SQL查询来查找其中field1不包含$ x的行。我怎样才能做到这一点? 问题答案: 这是什么领域?IN运算符不能与单个字段一起使用,而应与子查询或预定义列表一起使用: 如果要搜索字符串,请使用LIKE运算符(但这会很慢): 如果将其限制为要搜索的字符串必须以给定的字符串开头,则可以使用索引(如果该字段上有索引)并且速度相当快:

  • 问题内容: 我看到了这个功能: 这是什么?有功能吗?为什么要放置函数定义? 问题答案: 在javascript中,您可以拥有和函数。 与…相同 你称这些为 您可以定义函数并立即将其调用为 的 part定义一个函数,并在其后立即调用刚刚定义的函数,并以10和20作为参数。 由于该函数没有名称,因此无法在以后的代码中使用。 您问题中的代码可能被 缩小了 ,并以类似的方式创建了一个函数并立即调用它。

  • 我是XAML的新手。我想知道所有的x:和:x都是关于什么的。关于XAML的教程没有解释这一点(或者我还没有读够)。 例如: 这几行中的x是什么意思? 窗口x:Class=“WpfTutorialSamples.WPF_Application.ResourceSample” xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml“sys:字符串 x