我正在努力创造 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
我可以用这个。
1条答案
按热度按时间8wtpewkr1#
通过分配给变量并基于条件使用参数覆盖变量来构建sqoop语法,一旦构建了最终语法,就执行它。希望这有帮助。