来自python stdout = subprocess.pipe的Sqoop作业

时间:2017-01-19 07:00:25

标签: python python-3.x sqoop

我正在尝试使用Sqoop生成python命令。我可以传递并触发Sqoop查询。我想在Sqoop命令--map-column-java中映射列名,每列中的列数不同。只有BLOBCLOB需要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可以使用此功能。

1 个答案:

答案 0 :(得分:0)

通过分配变量并基于条件覆盖带参数的变量来构建sqoop语法,并在构建最终语法后执行它。希望这会有所帮助。