python stdout=subprocess.pipe中的sqoop作业

aiazj4mn  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(351)

我正在努力创造 Sqoop 命令使用 python . 我能通过并发射火箭 Sqoop 查询。我想把列名Map到 Sqoop 命令 --map-column-java 每列中的列数也不同。仅限 BLOB 以及 CLOB 必须是 mapped .
数据:

-----------------------------------------------
| COLUMN_NAME          | DATA_TYPE            |
-----------------------------------------------
| C460                 | VARCHAR2             |
| C459                 | CLOB                 |
| C458                 | VARCHAR2             |
| C457                 | VARCHAR2             |
| C456                 | CLOB                 |
| C8                   | BLOB                 |
| C60901               | VARCHAR2             |
-----------------------------------------------

样本代码:-

proc=subprocess.Popen(["sqoop", "eval", "--connect","jdbc:oracle:thin:@" + config["Production_host"]+":"+config["port"]+"/"+config['Production_SERVICE_NAME'],"--username", config["Production_User"], "--password", config["Production_Password"], "--query","SELECT column_name, data_type FROM all_tab_columns where table_name =" + "'"+ Tablename + "'"],stdout=subprocess.PIPE)
COl_Re=re.compile('(?m)(C\d+)(?=.+[CB]LOB)')
columns=COl_Re.findall(proc.stdout.read())

我可以得到所需的列名 C459,C456,C8 使用上述代码。输出 ['C459', 'C456','C8'] 我应该换个新的 Sqoop 以下格式查询

sqoop import --connect  "--connect","jdbc:oracle:thin:@" + config["Production_host"]+":"+config["port"]+"/"+config['Production_SERVICE_NAME'],"--username", config["Production_User"], "--password", config["Production_Password"], --table table --fields-terminated-by '|' --map-column-java C456=String,C459=String,C8=String --hive-drop-import-delims --input-null-string '\\N' --input-null-non-string '\\N'   --as-textfile --target-dir <Location>  -m 1

我只需要加上这部分 --map-column-java C456=String,C459=String,C8=String 这样我的下一个代码 subprocess.call 我可以用这个。

8wtpewkr

8wtpewkr1#

通过分配给变量并基于条件使用参数覆盖变量来构建sqoop语法,一旦构建了最终语法,就执行它。希望这有帮助。

相关问题