[HADOOP] Sqoop을 사용하여 MySQL에서 하이브로 데이터 가져 오기
HADOOPSqoop을 사용하여 MySQL에서 하이브로 데이터 가져 오기
MySQL에서 Hive로 데이터를 가져 오기 위해 Sqoop (버전 1.4.4)을 사용하고 있습니다. 데이터는 표 중 하나의 하위 집합, 즉 표의 일부 열입니다. Hive에 테이블을 만들어야합니다. 또는 데이터를 가져 오면 하이브에 없으면 명령에 지정된 이름이 생성됩니까?
해결법
-
==============================
1.sqoop 문서에서 언급했듯이, 명령에서 --hive-import 인수를 사용하면 하이브 테이블을 만들 필요가 없습니다.
sqoop 문서에서 언급했듯이, 명령에서 --hive-import 인수를 사용하면 하이브 테이블을 만들 필요가 없습니다.
예:
sqoop import --connect jdbc:mysql://mysql_server:3306/db_name --username mysql_user --password mysql_pass --table table_name --hive-import
또한 매일 데이터베이스에서 전체 데이터 가져 오기를 예약하려면 --hive-overwrite 인수를 고려하십시오.
-
==============================
2.마침내 문제가 해결되었습니다. 두 단계가 필요합니다.
마침내 문제가 해결되었습니다. 두 단계가 필요합니다.
외부 테이블 생성 : 하이브의 외부 테이블은 영구 테이블의 일종이며 하이브가 중지되거나 서버가 다운 된 경우에도 그대로 유지됩니다. "EXTERNAL"키워드는 테이블 유형을 지정하는 데 사용됩니다.
CREATE EXTERNAL TABLE IF NOT EXISTS HIVEDB.HIVE_TABLE1 (DATE_COL DATE, BIG_INT_COL BIGINT, INT_COL INT, VARCHAR_COL VARCHAR(221), FLOAT_COL FLOAT);
Sqoop을 사용하여 데이터 가져 오기 : "--hive-create"옵션을 사용하는 대신 데이터를 가져 오는 동안 만들어진 테이블 이름을 지정하십시오.
sqoop import --connect jdbc:mysql://mysqlhost/mysqldb --username user --password passwd --query "SELECT table1.date_col, table1.big_int_col, table1.int_col, table1.varchar_col, table1.float_col FROM MYSQL_TABLE1 AS table1 WHERE \$CONDITIONS" --split-by table1.date_col --hive-import --hive-table hivedb.hive_table1 --target-dir hive_table1_data`
데이터는 하이브에 영구 저장되었습니다.
-
==============================
3.하이브에 테이블이 없더라도 sqoop 가져 오기가 하이브에 테이블을 만듭니다. 다음은 나를 위해 일했다 :
하이브에 테이블이 없더라도 sqoop 가져 오기가 하이브에 테이블을 만듭니다. 다음은 나를 위해 일했다 :
sqoop import --connect jdbc:mysql://localhost/<<dbname>> --username <<YourMySqlUsername>> --password <<YourMySqlpwd>> --table employee --hive-import --hive-table employee_1 -m -1
-
==============================
4.Nayan, 당신은 아마 지금까지 그것을 알아 냈을 것입니다.
Nayan, 당신은 아마 지금까지 그것을 알아 냈을 것입니다.
EXTERNAL 여부에 관계없이 하이브 테이블은 HDFS에 저장됩니다.
키워드 EXTERNAL은 테이블과 해당 데이터를 느슨하게 연결합니다. 예를 들어 하이브 내에서 EXTERNAL 테이블을 삭제하면 스키마가 삭제되고 HDFS에서 데이터가 변경되지 않습니다.
-
==============================
5.첫째, EXTERNAL 테이블을 만들 필요가 없습니다. 그렇지 않으면 위의 솔루션이 약간 복잡합니다.
첫째, EXTERNAL 테이블을 만들 필요가 없습니다. 그렇지 않으면 위의 솔루션이 약간 복잡합니다.
mysql 스키마가 다음과 같이 보이면
mysql> describe emp; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | deg | varchar(20) | YES | | NULL | | | salary | int(11) | YES | | NULL | | | dept | varchar(20) | YES | | NULL | | +--------+-------------+------+-----+---------+-------+
그럼 내가했던 것처럼 하이브 테이블을 만들 필요가있다. userdb는 DATABASE이고 emp는 TABLE이다.
hive> CREATE TABLE userdb.emp ( id INT, name VARCHAR(20), deg VARCHAR(20), salary INT, dept VARCHAR(20)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
이제 sqoop 스크립트를 실행하는 문제입니다 (하이브 프롬프트에서 종료해야합니다). 그리고 hive2를 사용하지 않고 metastore_db가 존재하는 위치에서 아래 스크립트를 실행해야합니다 (예 : 사용 된 동일한 작업 디렉토리 하이브). 일부 해결 방법으로이 문제를 완화 할 수 있습니다 (추측). sqoop 스크립트는 다음과 같습니다.
sqoop import \ --connect jdbc:mysql://localhost/userdb \ --username root --password root \ --table emp --fields-terminated-by ',' \ --split-by id \ --hive-import --hive-table userdb.emp \ --target-dir /emp
명령이 성공하면 대상 디렉토리 ie / emp가 삭제됩니다. 필자는 명시 적으로 userdb.emp를 사용하여 하이브 테이블을 지정했습니다.
내 hdfs 디렉토리 구조
drwxr-xr-x - ubuntu supergroup 0 2016-12-18 13:20 /user/hive/warehouse/userdb.db/emp -rwxr-xr-x 3 ubuntu supergroup 28 2016-12-18 13:19 /user/hive/warehouse/userdb.db/emp/part-m-00000 -rwxr-xr-x 3 ubuntu supergroup 35 2016-12-18 13:20 /user/hive/warehouse/userdb.db/emp/part-m-00001 -rwxr-xr-x 3 ubuntu supergroup 29 2016-12-18 13:20 /user/hive/warehouse/userdb.db/emp/part-m-00002 -rwxr-xr-x 3 ubuntu supergroup 31 2016-12-18 13:20 /user/hive/warehouse/userdb.db/emp/part-m-00003 -rwxr-xr-x 3 ubuntu supergroup 28 2016-12-18 13:20 /user/hive/warehouse/userdb.db/emp/part-m-00004
-
==============================
6.테이블을 만들 필요가 없습니다. 불필요하다. 우리가 수입하는 동안 우리는 그것을 할 수 있습니다. 아래 명령을보십시오.
테이블을 만들 필요가 없습니다. 불필요하다. 우리가 수입하는 동안 우리는 그것을 할 수 있습니다. 아래 명령을보십시오.
sqoop import --connect jdbc:mysql://mysql_server:3306/db_name \ --username mysql_user \ --password mysql_pass \ --table table_name \ --hive-import
from https://stackoverflow.com/questions/22404641/using-sqoop-to-import-data-from-mysql-to-hive by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 잘못된 키 클래스 : 텍스트가 IntWritable이 아닙니다. (0) | 2019.07.10 |
---|---|
[HADOOP] 출력을 hdfs에 저장하지 않고 mapper-reducer의 출력을 다른 mapper-reducer로 직접 보내는 방법 (0) | 2019.07.10 |
[HADOOP] elasticsearch를 중앙 데이터 저장소로 사용 (0) | 2019.07.10 |
[HADOOP] 작업 시도가 600 초 동안 상태를보고하지 못해 감소가 실패합니다. 죽이는! 해결책? (0) | 2019.07.10 |
[HADOOP] HIVE에서 Date Series를 생성하는 방법은 무엇입니까? (테이블 만들기) (0) | 2019.07.10 |