2015-04-20 58 views
3

我想從Postgresql將表導入到HDFS上的Parquet文件。Sqoop + Postgresql:如何防止引用表名

這裏是我做的:

sqoop import \ 
    --connect "jdbc:postgresql://pg.foo.net:5432/bar" \ 
    --username user_me --password $PASSWORD \ 
    --table foo.bar \ 
    --target-dir /user/me/bar \ 
    --as-parquetfile 

,我得到

INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM "foo.bar" AS t LIMIT 1 
ERROR manager.SqlManager: Error executing statement: org.postgresql.util.PSQLException: ERROR: relation "foo.bar" does not exist 

SELECT t.* FROM "foo.bar" AS t LIMIT 1不確實工作,但SELECT t.* FROM foo.bar AS t LIMIT 1一樣。所以問題在於表名被引用。我嘗試以不同的方式提供--table參數,但沒有效果。

我該如何解決它?

編輯

當你鏈接狀態的文檔,有一個--schema的說法。由於某種原因,在sqoop help import中未提及。

另一個奇怪的是,

--table bar --schema foo 

仍然無法正常工作,但

--table bar -- --schema foo 

一樣。

無論如何,它現在有效。感謝您鏈接相關的文檔部分!

+1

該文檔解釋如下:'如果參數 - 是在命令行給出,然後後續參數直接發送到底層工具。例如,下面調整mysqldump使用的字符集:'所以看起來--schema被賦予了pg_dump:http://www.postgresql.org/docs/current/static/app-pgdump.html這意味着你可以使用其他的pg_dump控件...也許。 –

回答

3

表名是bar, foo是架構的名稱。 按照docs你應該這樣做,如:

sqoop import \ 
    (...) 
    --table bar \ 
    --schema foo 
    (...) 
+0

(upvoted)這幾乎是解決方案,謝謝! (我編輯了我的答案詳情) –

2

按照documentation你需要單獨指定模式:

sqoop import \ 
    --connect "jdbc:postgresql://pg.foo.net:5432/bar" \ 
    --username user_me --password $PASSWORD \ 
    --table bar \ 
    --schema foo \ 
    --target-dir /user/me/bar \ 
    --as-parquetfile 
+0

(upvoted)這幾乎是解決方案,謝謝! (我編輯了我的答案詳情) –

+0

@Jakub似乎在你面前幾秒鐘回答,所以我會接受他的回答。 –