无论是从Shell还是从python子进程运行,使用Sqoop从MySQL数据库获取数据都会产生不一致的结果。但是,即使从相同的python会话访问Oracle数据库,我也不会遇到相同问题。
以下命令会在shell中正常运行:
export username="user1"
URI="jdbc:mysql://$host/dbname"
URI="${URI}?verifyServerCertificate=false"
URI="${URI}&useSSL=true"
URI="${URI}&requireSSL=false"
## List Tables
sqoop list-tables \
--connect ${URI} \
--username ${username} \
--password-file password.file
但是从python子进程无法运行完全相同的事情:
import subprocess
## List Tables
subprocess.Popen(
'sqoop list-tables --connect jdbc:mysql://$host/dbname?verifyServerCertificate=false&useSSL=true&requireSSL=false --username user1 --password-file password.file',
shell=True)
出现以下错误:
ERROR [main] manager.CatalogQueryManager (LoggingUtils.java:logAll(43)) - Failed to list tables
java.sql.SQLException: Access denied for user ''@'100.100.100.100' (using password: NO)
我还需要做其他事情才能通过python子进程使用Sqoop连接到MySQL数据库吗?
答案 0 :(得分:0)
发布后立即想到了这一点。也许它可以帮助别人。
我需要将连接字符串包装在""
中。
以下是更整洁的python表示形式。
import subprocess
with open('lbaDevUsername.file', 'r') as f:
username = f.read()
URI = "jdbc:mysql://$host/dbname"
URI = "{}?verifyServerCertificate=false".format(URI)
URI = "{}&useSSL=true".format(URI)
URI = "{}&requireSSL=false".format(URI)
## List Tables
subprocess.Popen("""
sqoop list-tables \
--connect "{}" \
--username {} \
--password-file password.file
""".format(URI, username), shell=True)