我正在尝试使用Sqoop
生成python
命令。我可以传递并触发Sqoop
查询。我想在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
可以使用此功能。
答案 0 :(得分:0)
通过分配变量并基于条件覆盖带参数的变量来构建sqoop语法,并在构建最终语法后执行它。希望这会有所帮助。