Scio类型安全BigQuery类注解问题:类型参数不匹配报错
解决Scio typedBigQuery的类型边界错误
你遇到的这个错误核心原因是RowElement类的定义位置不符合Scio宏处理器的要求,导致它没法生成满足BigQueryType.HasAnnotation边界的类型实现。具体来说,你把带@BigQueryType.fromQuery注解的类放在了main方法内部,而Scio的宏只能正确处理顶层类或静态成员类的注解。
修正步骤
- 将
RowElement的定义从main方法内部移到外部,作为顶层类或者伴生对象的成员类 - 确保注解能被Scio宏正确识别并生成对应的类型实现
修正后的代码示例
import com.spotify.scio._ import com.spotify.scio.bigquery._ // 把带注解的类移到main方法外,作为顶层类 @BigQueryType.fromQuery("select id, org, env from TABLE") class RowElement object MyScioJob { def main(args: Array[String]): Unit = { val (sc: ScioContext, arg) = ContextAndArgs(args) sc.typedBigQuery[RowElement]("select id, org, env from TABLE") .saveAsTypedBigQuery("TABLE_DEST") sc.close() } }
额外补充
如果不想用顶层类,也可以把RowElement定义在伴生对象内部,同样能被Scio宏正确处理:
object MyScioJob { @BigQueryType.fromQuery("select id, org, env from TABLE") class RowElement def main(args: Array[String]): Unit = { val (sc: ScioContext, arg) = ContextAndArgs(args) sc.typedBigQuery[RowElement]("select id, org, env from TABLE") .saveAsTypedBigQuery("TABLE_DEST") sc.close() } }
这样调整后,Scio就能正确生成符合要求的RowElement类型实现,满足typedBigQuery的参数边界限制,你遇到的错误应该就会消失了。
内容的提问来源于stack exchange,提问作者Akhilesh
相关产品推荐
相关产品推荐

