我有一个Apache Beam任务,它使用JDBC从MySQL源读取,并且它应该将数据原样写入BigQuery表。此时不会执行转换,稍后会发生,我只想将数据库输出直接写入BigQuery。
这是尝试执行此操作的主要方法:
public static void main(String[] args) {
Options options = PipelineOptionsFactory.fromArgs(args).withValidation().as(Options.class);
Pipeline p = Pipeline.create(options);
// Build the table schema for the output table.
List<TableFieldSchema> fields = new ArrayList<>();
fields.add(new TableFieldSchema().setName("phone").setType("STRING"));
fields.add(new TableFieldSchema().setName("url").setType("STRING"));
TableSchema schema = new TableSchema().setFields(fields);
p.apply(JdbcIO.<KV<String, String>>read()
.withDataSourceConfiguration(JdbcIO.DataSourceConfiguration.create(
"com.mysql.jdbc.Driver", "jdbc:mysql://host:3306/db_name")
.withUsername("user")
.withPassword("pass"))
.withQuery("SELECT phone_number, identity_profile_image FROM scraper_caller_identities LIMIT 100")
.withRowMapper(new JdbcIO.RowMapper<KV<String, String>>() {
public KV<String, String> mapRow(ResultSet resultSet) throws Exception {
return KV.of(resultSet.getString(1), resultSet.getString(2));
}
})
.apply(BigQueryIO.Write
.to(options.getOutput())
.withSchema(schema)
.withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_TRUNCATE)));
p.run();
}
但是当我使用maven执行模板时,我收到以下错误:
Test.java:[184,6]找不到符号符号:方法 申请(com.google.cloud.dataflow.sdk.io.BigQueryIO.Write.Bound)
location:class org.apache.beam.sdk.io.jdbc.JdbcIO.Read&lt; com.google.cloud.dataflow.sdk.values.KV&lt; java.lang.String,java.lang.String&gt;&gt;
似乎我没有通过BigQueryIO.Write预期的数据收集,而这正是我目前正在努力的目标。
在这种情况下,如何使来自MySQL的数据符合BigQuery的期望?
答案 0 :(得分:2)
我认为你需要提供一个PCollection&lt; TableRow&gt;到BigQueryIO.Write而不是PCollection&lt; KV&lt; String,String&gt;&gt; RowMapper输出的类型。
另外,请在设置TableRow时使用正确的列名和值对。 注意:我认为您的KV是电话和网址值(例如{“555-555-1234”:“http://www.url.com”}),而不是列名和值对(例如{“phone”:“555 -555-1234“,”url“:”http://www.url.com“})
请参阅此处的示例: https://beam.apache.org/documentation/sdks/javadoc/0.5.0/
请您尝试一下,让我知道它是否适合您?希望这会有所帮助。