Apex的所有示例都表明DAG的第一个运算符应该是输入运算符。此操作符是否会出现在DAG中间的某个位置。
考虑这样一种情况,我有数据要从数据库中提取,基于一些刚刚由前一个操作符处理的数据,这意味着输入操作符将出现在DAG中的某个位置。
根据输入运算符的定义,它是没有任何输入流的运算符。但是,如果使用连接器,它还会执行获取数据的工作。那么,如果我在DAG之间的某个位置获取数据,它会起作用吗?
发布于 2017-03-01 03:10:50
这是一个有趣的用例。您应该能够扩展输入操作符(比如JdbcInputOperator,因为您希望从数据库中读取数据)并向其添加输入端口。此输入端口从您的DAG中的另一个操作符接收数据(元组),并更新JdbcInputOperator的"where“子句,以便读取基于该子句的数据。希望这就是你要找的。
发布于 2017-03-01 04:13:23
是的,这是可能的。您可以扩展现有的InputOperator并向其添加InputPort。在这种情况下,Apex平台将把您的运算符作为通用运算符处理,而不调用InputOperator.emitTuples()
。调用super.emitTuples()
或直接在输出端口上发出将是您的扩展操作员职责。
发布于 2017-03-01 02:55:53
不能,在DAG之间不能使用输入操作符。正如您已经指出的,由于没有输入流,您将无法从以前的运算符获取数据,以便与此运算符一起使用。
对于您所指出的示例,最好编写自己的带有输入流的泛型操作符,该输入流实际上具有与输入操作符相似的功能,其中它可以基于输入流中的数据从外部源读取数据。
另外,只需要注意一点:如果查询太繁重,最好使用异步线程来查询数据库。此线程可以将数据写入队列,主线程可以从队列中读取记录并在输出流中发出它们。这将确保主运算符线程不会被阻塞,并且运算符不会失败。
https://stackoverflow.com/questions/42502832
复制相似问题