2

我想使用 sqoop (2) 导出从 avro 文件填充 postgres 表,但我在源中没有 id 字段,应该自动填充(串行类型),但我收到错误。

表 DDL:

CREATE TABLE test
 (
 id serial primary key,
 partner_id varchar,
 column1 varchar,
 column2 varchar
)

avro 架构:

{
"namespace": "avro_test",
"type": "record",
"name": "test",
"fields": [
      {"name": "partner_id", "type": "string"},
      {"name": "column1", "type": ["string","null"]},
      {"name": "column2", "type": ["string","null"]}
      ]
}

我使用的导出命令:

./sqoop-1.4.5.bin__hadoop-2.0.4-alpha/bin/sqoop export \
    --connect jdbc:postgresql://host/db \
    --username user_test --password pass_test \
    --table test \
    --export-dir path \
    --columns partner_id,column1,column2

但我收到一个错误,我在 avro 架构中没有 id:

Status : FAILED
Error: java.io.IOException: Cannot find field id in Avro schema

我尝试使用 --columns 参数指定目标列,但它不起作用。我如何加载上面的 avro 文件?

如果我从表中删除 id 字段,它会成功导出

提前致谢

4

1 回答 1

0

简单的解决方案是在您的 avro 架构中添加 id,默认为 null

{
  "namespace": "avro_test",
  "type": "record",
  "name": "test",
  "fields": [
        {"name": "id", "type": ["null", "int"]},
        {"name": "partner_id", "type": "string"},
        {"name": "column1", "type": ["string","null"]},
        {"name": "column2", "type": ["string","null"]}
  ]

}

通过 Sqoop 导出到 mysql 时,它会自动填充主键“Id”。希望这可以帮助!

于 2018-08-05T19:32:53.527 回答