Вы правы, ParDos
- это поэлементные преобразования, и ваш подход выглядит правильно.
То, что вы видите, это ошибка компиляции. Примерно так происходит, когда тип аргумента метода apply()
, который был выведен компилятором java, не соответствует типу фактического ввода, например convertToTableRowFn
.
Из ошибки, которую вы видите, похоже, что Java выводит, что второй параметр для apply()
имеет тип PTransform<? super PCollection<PubsubMessage>,OutputT>
, в то время как вы передаете подкласс ParDo.SingleOutput<PubsubMessage,TableRow>
(ваш convertToTableRowFn
). Глядя на определение SingleOutput
ваш convertToTableRowFn
в основном PTransform<PCollection<? extends PubsubMessage>, PCollection<TableRow>>
. И Java не может использовать его в apply
, где он ожидает PTransform<? super PCollection<PubsubMessage>,OutputT>
.
Что выглядит подозрительным, так это то, что java не выводил OutputT
на PCollection<TableRow>
. Одна из причин, по которой это не удастся сделать, если у вас есть другие ошибки. Вы уверены, что у вас нет других ошибок?
Например, глядя на convertToTableRowFn
, вы звоните message.getData()
, которого не существует, когда я пытаюсь это сделать, и он терпит неудачу при компиляции. В моем случае мне нужно сделать что-то вроде этого: rawData = new String(message.getPayload(), Charset.defaultCharset())
. Также .to(BQTable))
ожидает строку (например, строку, представляющую имя таблицы BQ) в качестве аргумента, и вы передаете некоторый неизвестный символ BQTable
(возможно, он где-то существует в вашей программе, хотя в вашем случае это не является проблемой) ).
После того, как я исправлю эти две ошибки, ваш код компилируется для меня, apply()
полностью выведен и типы совместимы.