복붙노트

[HADOOP] Sqoop을 가져 오기를 사용하여, 어떻게 기존 하이브 테이블에 행을 추가하려면?

HADOOP

Sqoop을 가져 오기를 사용하여, 어떻게 기존 하이브 테이블에 행을 추가하려면?

SQL 서버에서 나는 수입과 아래의 쿼리를 사용하여 하이브 테이블을 만들었습니다.

sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --table demotable --hive-import --hive-table hivedb.demotable --create-hive-table --fields-terminated-by ','

명령이 성공적으로 데이터를 가져오고 10000 개 레코드 테이블을 만들었습니다.

나는 SQL 서버에서 10 개 개의 새로운 기록을 삽입 --where 절을 사용하여 기존 하이브 테이블에 이러한 10 개 개의 레코드를 추가하려

sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --table demotable --where "ID > 10000" --hive-import -hive-table hivedb.demotable

그러나 Sqoop을 작업이 오류로 인해 실패지고

어디서 잘못된 것입니까? 다른 대안은 Sqoop을을 사용하여 테이블에 삽입합니다.

편집하다: 약간 위의 명령을 변경 한 후 나는 새 행을 추가 할 수 있어요.

sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --table demotable --where "ID > 10000" --hive-import -hive-table hivedb.demotable --fields-terminated-by ',' -m 1

가 언급 한 문제를 해결했지만, 나는 수정 된 행을 삽입 할 수 없습니다. 사용하지 않고 수정 된 행을 삽입하는 방법이 있나요 --incremental LASTMODIFIED 매개 변수입니다.

해결법

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

    1.테이블을 하이브 행을 추가하기 위해 이전에 사용 된 같은 쿼리를 사용하여, 단지 --hive 덮어 쓰기를 제거합니다.

    테이블을 하이브 행을 추가하기 위해 이전에 사용 된 같은 쿼리를 사용하여, 단지 --hive 덮어 쓰기를 제거합니다.

    난 당신이 오기 위해 동일을 사용할 수 있습니다, 내가 덮어 쓰기위한 하나 APPEND 하나, 하이브에서 수입하는 데 사용되는 2 개 쿼리를 공유합니다 :

    이전 기록을 덮어 쓰려면

    sqoop import -Dmapreduce.job.queuename=default --connect     jdbc:teradata://database_connection_string/DATABASE=database_name,TMODE=ANSI,LOGMECH=LDAP --username z****** --password ******* --query "select * from ****** where \$CONDITIONS" --split-by "HASHBUCKET(HASHROW(key to split)) MOD 4" --num-mappers 4 --hive-table hive_table_name --boundary-query "select 0, 3 from dbc.dbcinfo" --target-dir directory_name  --delete-target-dir --hive-import --hive-overwrite --driver com.teradata.jdbc.TeraDriver
    

    이전 기록에 추가 할

     sqoop import -Dmapreduce.job.queuename=default --connect jdbc:teradata://connection_string/DATABASE=db_name,TMODE=ANSI,LOGMECH=LDAP --username ****** --password ******--query "select * from **** where \$CONDITIONS" --split-by "HASHBUCKET(HASHROW(key to split)) MOD 4" --num-mappers 4 --hive-import --hive-table guestblock.prodrptgstrgtn --boundary-query "select 0, 3 from dbc.dbcinfo" --target-dir directory_name  --delete-target-dir --driver com.teradata.jdbc.TeraDriver
    

    내가 4 매퍼를 사용하고, 더뿐만 아니라 사용할 수 있습니다.

  2. ==============================

    2.난 당신이 --hive 가져 오기 옵션을 Sqoop을 직접 --append 옵션을 제공 할 수 있는지 모르겠습니다. 그 여전히 사용할 수 없습니다이어야 버전 1.4입니다.

    난 당신이 --hive 가져 오기 옵션을 Sqoop을 직접 --append 옵션을 제공 할 수 있는지 모르겠습니다. 그 여전히 사용할 수 없습니다이어야 버전 1.4입니다.

    기본 동작은 --hive 덮어 쓰기 및 --create-하이브 테이블이없는 경우 추가합니다. (이 문맥이어야한다.

    나는 nakulchawla09의 대답과 함께 할 것입니다. 비록 --split 별 옵션을 유지하기 위해 자신을 생각 나게 해요. 이 적절하게 생성 하이브 데이터 저장소의 분할 이름을 보장합니다. 그렇지 않으면 기본 이름을 좋아하지 않을 것이다. 당신은 당신이 무대 하이브웨어 하우스 이름 지정 및 무대 데이터 저장소에 대해 걱정하지 않는 경우이 댓글을 무시할 수 있습니다. 나는 아래의 명령으로했을 때

    추가] 전

    beeline:hive2> select count(*) from geolocation;
    
    +-------+--+
    |  _c0  |
    +-------+--+
    | 8000  |
    +-------+--+
    

    추가] 전에 하이브 창고에 파일을

    -rwxrwxrwx   1 root hdfs     479218 2018-10-12 11:03 /apps/hive/warehouse/geolocation/part-m-00000
    

    다시 추가 8K 기록을 추가하기위한 명령을 Sqoop을

    sqoop import --connect jdbc:mysql://localhost/RAWDATA --table geolocation --username root --password hadoop --target-dir /rawdata --hive-import  --driver com.mysql.jdbc.Driver --m 1 --delete-target-dir
    

    그것은 아래의 파일을 만들었습니다. 당신은 옵션 또는 분할 해시 (날짜 또는 날짜 될 수 있습니다)에 의해 분할을 제공하지 않았기 때문에 파일 이름이 잘되지 않습니다 볼 수 있습니다.

    -rwxrwxrwx   1 root hdfs     479218 2018-10-12 11:03 /apps/hive/warehouse/geolocation/part-m-00000
    -rwxrwxrwx   1 root hdfs     479218 2018-10-12 11:10 /apps/hive/warehouse/geolocation/part-m-00000_copy_1
    

    하이브 기록은 지금 추가

    직선 : 지리적 위치로부터 hive2> 선택 수 (*);

    +-------+--+
    |  _c0  |
    +-------+--+
    | 16000  |
    +-------+--+
    
  3. ==============================

    3.우리는이 명령을 사용할 수 있습니다 :

    우리는이 명령을 사용할 수 있습니다 :

     sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --query 'select * from demotable where ID > 10000' --hive-import --hive-table hivedb.demotable --target-dir demotable_data
    
  4. ==============================

    4.그래서 아래와 같이 될 것입니다 옵션을 --append 사용하여 1 -m :

    그래서 아래와 같이 될 것입니다 옵션을 --append 사용하여 1 -m :

    sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --table demotable --hive-import --hive-table hivedb.demotable --append -m 1
    
  5. from https://stackoverflow.com/questions/32885590/using-sqoop-import-how-to-append-rows-into-existing-hive-table by cc-by-sa and MIT license