与 Sqoop 不一致的结果

Posted

技术标签:

【中文标题】与 Sqoop 不一致的结果【英文标题】:Inconsistent result with Sqoop 【发布时间】:2019-04-25 20:53:08 【问题描述】:

使用 Sqoop 从 mysql 数据库获取数据,无论是从 shell 运行还是从 python 子进程运行,结果都不一致。但是,即使在同一个 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 数据库吗?

【问题讨论】:

【参考方案1】:

发布后立即解决了这个问题。也许它可以帮助别人。

我需要将连接字符串包装在"" 中。

以下是更简洁的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)

【讨论】:

以上是关于与 Sqoop 不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop 防止数据导出不一致的参数配置

使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法

ggplot图与观察结果不一致

DES加密解密结果为何不一致?

Caffe框架GPU与MLU计算结果不一致请问如何调试?

Caffe框架GPU与MLU计算结果不一致请问如何调试?