복붙노트

[HADOOP] Sqoop을 사용하여 MySQL에서 하이브로 데이터 가져 오기

HADOOP

Sqoop을 사용하여 MySQL에서 하이브로 데이터 가져 오기

MySQL에서 Hive로 데이터를 가져 오기 위해 Sqoop (버전 1.4.4)을 사용하고 있습니다. 데이터는 표 중 하나의 하위 집합, 즉 표의 일부 열입니다. Hive에 테이블을 만들어야합니다. 또는 데이터를 가져 오면 하이브에 없으면 명령에 지정된 이름이 생성됩니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.Nayan, 당신은 아마 지금까지 그것을 알아 냈을 것입니다.

    Nayan, 당신은 아마 지금까지 그것을 알아 냈을 것입니다.

    EXTERNAL 여부에 관계없이 하이브 테이블은 HDFS에 저장됩니다.

    키워드 EXTERNAL은 테이블과 해당 데이터를 느슨하게 연결합니다. 예를 들어 하이브 내에서 EXTERNAL 테이블을 삭제하면 스키마가 삭제되고 HDFS에서 데이터가 변경되지 않습니다.

  5. ==============================

    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. ==============================

    6.테이블을 만들 필요가 없습니다. 불필요하다. 우리가 수입하는 동안 우리는 그것을 할 수 있습니다. 아래 명령을보십시오.

    테이블을 만들 필요가 없습니다. 불필요하다. 우리가 수입하는 동안 우리는 그것을 할 수 있습니다. 아래 명령을보십시오.

    sqoop import --connect jdbc:mysql://mysql_server:3306/db_name \
    --username mysql_user \
    --password mysql_pass \
    --table table_name \
    --hive-import
    
  7. from https://stackoverflow.com/questions/22404641/using-sqoop-to-import-data-from-mysql-to-hive by cc-by-sa and MIT license