在数据流中使用外部类

时间:2018-07-06 19:15:57

标签: java google-cloud-platform google-cloud-dataflow apache-beam

我正在尝试制作一个接受侧面输入的自定义转换类,并且正在使用PipelineTester和PAssert对其进行测试,但在尝试引入转换的方法上却始终没有此类方法异常来自其他班级。

  

原因:java.lang.NoSuchMethodError:   com.org.utils.MyUtils.createMap(Ljava / lang / Iterable;)Ljava / util / Map;     在com.org.beam.MyTransform.ProcessElement(MyTransform.java:51)

我尝试使用@Autowired注释引入类似的类

@Autowired
private MyUtils myutils;

以及仅使用类似代码的静态实例

private static MyUtils myUtils = new MyUtils();

然后致电

this.myUtils.createMap(mapThisToThat(inputCollection, this.myMap));

我还尝试过使方法静态化并像调用它们一样

MyUtils.createMap(mapThisToThat(inputCollection, this.myMap));

mapThisToThat的签名是

private Iterable<MyObject> mapThisToThat(Iterable<MyObject> objectIterator, Map<String, Integer> myMap) {

传递给具有此签名的createMap方法-

public Map<String, MyObject> createMap(Iterable<MyObject> inputCollection){

因此它正确地传递了MyObjects的Iterable,但是它说该方法由于某种原因不存在。这是否意味着光束变换不能使用外部方法,或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

对于我在python中来说,要使其正常工作,我需要做很多事情:

https://cloud.google.com/dataflow/faq#how-do-i-handle-nameerrors https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/

对于您在Java中来说,由于某种原因,他们没有相互的文档,但在这里https://beam.apache.org/documentation/runners/dataflow/他们说这样的话:

  

在某些情况下,例如使用调度程序(例如Apache AirFlow)启动管道,您必须具有独立的应用程序。除了在上一节中显示的添加现有依赖关系之外,还可以通过在pom.xml的Project部分上显式添加以下依赖关系来打包自执行JAR。

在他们的示例自述文件https://github.com/mbrukman/apache-beam/tree/master/examples/java中,他们这样说

  

或者,您可以选择将所有依赖项捆绑到一个JAR中,然后在Maven环境之外执行它。例如,您可以执行以下命令来创建示例的捆绑JAR,并在本地和Cloud Platform中执行

如果继续浏览该示例存储库,将存在一个包含utils的common文件夹。希望您可以复制他们的操作方式。