Я пытаюсь сгенерировать команду Sqoop
, используя python
. Я могу передать и запустить запрос Sqoop
. Я хотел сопоставить имя столбца в команде Sqoop
--map-column-java
, а количество столбцов в каждом столбце различно. только BLOB
и CLOB
должно быть mapped
.Sqoop job from python stdout = subprocess.pipe
данных:
-----------------------------------------------
| 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
может использовать это.
было бы здорово, если бы вы могли показать пример. Этого я уже сделал RND. –