복붙노트

[HADOOP] Hive에서 레코드를 삭제하고 업데이트하는 방법

HADOOP

Hive에서 레코드를 삭제하고 업데이트하는 방법

나는 Hadoop, Hive, Hive JD BC를 설치했다. 나는 나를 위해 잘 달리고있다. 그러나 나는 아직도 문제가있다. Hive를 사용하여 단일 레코드를 삭제하거나 업데이트하는 방법은 MySQL의 삭제 또는 업데이트 명령이 하이브에서 작동하지 않기 때문입니다.

감사

hive> delete from student where id=1;
Usage: delete [FILE|JAR|ARCHIVE] <value> [<value>]*
Query returned non-zero code: 1, cause: null

해결법

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

    1.Hive가 일반 RDBMS로 생각해서는 안되며, Hive는 매우 큰 세트의 불변 데이터에 대해 배치 처리에 더 적합합니다.

    Hive가 일반 RDBMS로 생각해서는 안되며, Hive는 매우 큰 세트의 불변 데이터에 대해 배치 처리에 더 적합합니다.

    다음은 하이브 0.14 이전 버전에 적용됩니다. 이후 버전에서는 @ashtonium의 답변을 참조하십시오.

    특정 레코드 또는 특정 레코드 집합을 삭제하거나 업데이트 할 수있는 작업이 없으며 이는 나약한 스키마의 징후입니다.

    다음은 공식 문서에서 찾을 수있는 내용입니다.

    Hadoop is a batch processing system and Hadoop jobs tend to have high latency and
    incur substantial overheads in job submission and scheduling. As a result -
    latency for Hive queries is generally very high (minutes) even when data sets
    involved are very small (say a few hundred megabytes). As a result it cannot be
    compared with systems such as Oracle where analyses are conducted on a
    significantly smaller amount of data but the analyses proceed much more
    iteratively with the response times between iterations being less than a few
    minutes. Hive aims to provide acceptable (but not optimal) latency for
    interactive data browsing, queries over small data sets or test queries.
    
    Hive is not designed for online transaction processing and does not offer
    real-time queries and row level updates. It is best used for batch jobs over
    large sets of immutable data (like web logs).
    

    이 제한 사항을 해결하는 방법은 파티션을 사용하는 것입니다. 사용자의 ID가 무엇인지에 대해서는 모르지만 별도로 다른 ID 일괄 처리를 사용하는 경우 ID로 파티션을 나누도록 테이블을 다시 디자인 한 다음 제거 할 ID의 파티션을 쉽게 삭제할 수 있습니다.

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

    2.Hive 버전 0.14.0부터 : INSERT ... VALUES, UPDATE 및 DELETE를 이제 전체 ACID 지원과 함께 사용할 수 있습니다.

    Hive 버전 0.14.0부터 : INSERT ... VALUES, UPDATE 및 DELETE를 이제 전체 ACID 지원과 함께 사용할 수 있습니다.

    INSERT ... VALUES 구문 :

    INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
    

    values_row는 다음과 같습니다. (값 [, 값 ...]) 여기서 값은 null 또는 유효한 SQL 리터럴 중 하나입니다.

    UPDATE 구문 :

    UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
    

    DELETE 구문 :

    DELETE FROM tablename [WHERE expression]
    

    또한, 하이브 트랜잭션 문서에서 :

    하이브 DML 참조 : https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML 하이브 트랜잭션 참조 : https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions

  3. ==============================

    3.네, 맞습니다. Hive는 UPDATE 옵션을 지원하지 않습니다. 그러나 다음과 같은 대안을 사용하여 결과를 얻을 수 있습니다.

    네, 맞습니다. Hive는 UPDATE 옵션을 지원하지 않습니다. 그러나 다음과 같은 대안을 사용하여 결과를 얻을 수 있습니다.

    분할 된 하이브 테이블의 레코드 업데이트 :

    위의 예에서 main_table 및 staging_table은 (c, d) 키를 사용하여 분할됩니다. 테이블은 LEFT OUTER JOIN을 통해 조인되며 결과는 main_table의 파티션을 덮어 쓰는 데 사용됩니다.

    분할되지 않은 하이브 테이블 UPDATE 작업의 경우에도 비슷한 접근 방식을 사용할 수 있습니다.

  4. ==============================

    4.workaround를 사용하면 테이블에서 행을 삭제할 수 있습니다.이 작업에서는 조작 결과로 테이블에 남아있는 데이터 세트로 테이블을 덮어 씁니다.

    workaround를 사용하면 테이블에서 행을 삭제할 수 있습니다.이 작업에서는 조작 결과로 테이블에 남아있는 데이터 세트로 테이블을 덮어 씁니다.

    insert overwrite table your_table 
        select * from your_table 
        where id <> 1
    ;
    

    해결 방법은 주로 쉽게 식별 할 수있는 행을 일괄 삭제하는 데 유용합니다. 또한 분명히 이렇게하면 데이터를 망칠 수 있으므로 테이블의 백업은 "삭제"규칙을 계획 할 때주의를 기울이고주의를 기울입니다.

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

    5.CLI가 실수를 어디에서 말 했나요? 무엇을 삭제합니까? 학생으로부터 ...

    CLI가 실수를 어디에서 말 했나요? 무엇을 삭제합니까? 학생으로부터 ...

    삭제 : Hadoop-Hive에서 테이블을 삭제하거나 자르는 방법은 무엇입니까?

    업데이트 : Hive의 업데이트, SET 옵션

  6. ==============================

    6.모든 레코드를 삭제하려면 비어있는 파일을 OVERWRITE 모드의 테이블에로드하십시오

    모든 레코드를 삭제하려면 비어있는 파일을 OVERWRITE 모드의 테이블에로드하십시오

    hive> LOAD DATA LOCAL INPATH '/root/hadoop/textfiles/empty.txt' OVERWRITE INTO TABLE employee;
    Loading data to table default.employee
    Table default.employee stats: [numFiles=1, numRows=0, totalSize=0, rawDataSize=0]
    OK
    Time taken: 0.19 seconds
    
    hive> SELECT * FROM employee;
    OK
    Time taken: 0.052 seconds
    
  7. ==============================

    7.INSERT, UPDATE, DELETE에 대해 설정할 구성 값 위에 나열된 새 매개 변수 외에도 INSERT ... VALUES, UPDATE 및 DELETE를 지원하도록 일부 기존 매개 변수를 설정해야합니다.

    INSERT, UPDATE, DELETE에 대해 설정할 구성 값 위에 나열된 새 매개 변수 외에도 INSERT ... VALUES, UPDATE 및 DELETE를 지원하도록 일부 기존 매개 변수를 설정해야합니다.

    구성 키 반드시로 설정해야합니다.

    hive.support.concurrency true (기본값은 false 임) hive.enforce.bucketing true (기본값은 false 임) (하이브 2.0에서는 필요 없음) hive.exec.dynamic.partition.mode nonstrict (기본값은 strict)

    압축에 설정할 구성 값

    시스템의 데이터가 Hive 사용자 (즉, Hive 메타 스토어가 실행되는 사용자)의 소유가 아니라면 Hive는 압축을 수행하기 위해 데이터를 소유 한 사용자 권한으로 실행해야합니다. 이미 사용자를 가장하려고 HiveServer2를 설정 한 경우, 추가 작업으로 Hive가 Hive 메타 스토어를 실행하는 호스트의 사용자를 가장 할 수 있습니다. Hadoop의 core-site.xml 파일에서 hadoop.proxyuser.hive.hosts에 호스트 이름을 추가하면됩니다. 아직이 작업을 수행하지 않았다면 Hive가 프록시 사용자로 작동하도록 구성해야합니다. 이를 위해서는 Hive 메타 스토어를 실행하는 사용자의 키탭을 설정하고 hadoop.proxyuser.hive.hosts 및 hadoop.proxyuser.hive.groups를 Hadoop의 core-site.xml 파일에 추가해야합니다. 사용중인 Hadoop 버전의 보안 모드에 대한 Hadoop 설명서를 참조하십시오 (예 : 보안 모드의 Hadoop에있는 Hadoop 2.5.1의 경우).

    UPDATE 문에는 다음과 같은 제한 사항이 있습니다.

    WHERE 절의 표현식은 Hive SELECT 절이 지원하는 표현식이어야합니다.

    파티션 및 버킷 열을 업데이트 할 수 없습니다.

    쿼리 벡터화는 UPDATE 문에서 자동으로 비활성화됩니다. 그러나 벡터화를 사용하여 업데이트 된 테이블을 계속 쿼리 할 수 ​​있습니다.

    하위 문의는 SET 문의 오른쪽에 허용되지 않습니다.

    다음 예에서는이 문을 올바르게 사용하는 방법을 보여줍니다.

    UPDATE students SET name = null WHERE gpa <= 1.0;

    DELETE 문

    DELETE.을 사용하여 이미 Apache Hive에 기록 된 데이터를 h 제하십시오.

    DELETE FROM tablename [WHERE 표현식];

    DELETE 문에는 다음과 같은 제한 사항이 있습니다. 쿼리 벡터화는 DELETE 작업에 대해 자동으로 비활성화됩니다. 그러나 삭제 된 데이터가있는 테이블은 벡터화를 사용하여 쿼리 할 수 ​​있습니다.

    다음 예에서는이 문을 올바르게 사용하는 방법을 보여줍니다.

    gpa <= 1,0;

  8. ==============================

    8.하이브의 차기 버전은 SET 기반의 업데이트 / 삭제 처리를 허용 할 예정이며, 이는 한 번에 한 행을 사용하는 대신 행의 '묶음'에 대해 CRUD 연산을 수행 할 때 가장 중요합니다.

    하이브의 차기 버전은 SET 기반의 업데이트 / 삭제 처리를 허용 할 예정이며, 이는 한 번에 한 행을 사용하는 대신 행의 '묶음'에 대해 CRUD 연산을 수행 할 때 가장 중요합니다.

    잠정적으로, 여기 http://linkd.in/1Fq3wdb에 문서화 된 동적 파티션 기반 접근 방식을 시도했습니다.

    그것이 당신의 필요에 맞는 지보십시오.

  9. ==============================

    9.하이브를 설치하고 구성했으면 간단한 표를 만듭니다.

    하이브를 설치하고 구성했으면 간단한 표를 만듭니다.

    hive>create table testTable(id int,name string)row format delimited fields terminated by ',';
    

    그런 다음 테스트 테이블에 행을 적게 삽입하십시오.

    hive>insert into table testTable values (1,'row1'),(2,'row2');
    

    이제 테이블에 삽입 한 레코드를 삭제하려고합니다.

    hive>delete from testTable where id = 1;
    

    오류! FAILED : SemanticException [오류 10294] :이 작업을 지원하지 않는 트랜잭션 관리자를 사용하여 업데이트 또는 삭제를 시도합니다.

    기본적으로 트랜잭션은 해제되도록 구성됩니다. 변환 관리자에서 사용 된 삭제 작업에서는 업데이트가 지원되지 않는다고합니다. 업데이트 / 삭제를 지원하려면 다음 구성을 변경해야합니다.

    cd  $HIVE_HOME
    vi conf/hive-site.xml
    

    아래 속성을 파일에 추가하십시오

    <property>
      <name>hive.support.concurrency</name>
      <value>true</value>
     </property>
     <property>
      <name>hive.enforce.bucketing</name>
      <value>true</value>
     </property>
     <property>
      <name>hive.exec.dynamic.partition.mode</name>
      <value>nonstrict</value>
     </property>
     <property>
      <name>hive.txn.manager</name>
      <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
     </property>
     <property>
      <name>hive.compactor.initiator.on</name>
      <value>true</value>
     </property>
     <property>
      <name>hive.compactor.worker.threads</name>
      <value>2</value>
     </property>
    

    서비스를 다시 시작한 다음 delete 명령을 다시 시도하십시오.

    오류!

    FAILED : LockException [오류 10280] : 메타 스토어와 통신하는 중 오류가 발생했습니다.

    metastore에 문제가 있습니다. 삽입 / 업데이트 / 삭제 작업을 사용하려면 현재 기능이 개발 중이므로 conf / hive-site.xml에서 다음 구성을 변경해야합니다.

    <property>
      <name>hive.in.test</name>
      <value>true</value>
     </property>
    

    서비스를 다시 시작한 다음 명령을 다시 삭제하십시오.

    hive>delete from testTable where id = 1;
    

    오류!

    FAILED : SemanticException [오류 10297] : AcidOutputFormat을 사용하지 않거나 버킷 화되지 않은 테이블 default.testTable에서 업데이트 또는 삭제를 시도합니다.

    이 첫 번째 릴리스에서는 ORC 파일 형식 만 지원됩니다. 이 기능은 트랜잭션이 기본 레코드 (기본적으로 명시 적 또는 암시 적 행 ID 있음)에 적용되는 방식을 결정할 수있는 모든 저장 형식에서 트랜잭션을 사용할 수 있도록 구축되었지만 지금까지는 통합 작업 만 수행되었습니다 ORC.

    이러한 기능을 사용하려면 표를 버킷에 넣어야합니다. 트랜잭션 및 ACID를 사용하지 않는 동일한 시스템의 테이블은 버킷화할 필요가 없습니다.

    ORCFileformat, 버킷 사용 및 ( 'transactional'= 'true')를 사용하여 아래의 표를 작성하십시오.

    hive>create table testTableNew(id int ,name string ) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');
    

    삽입 :

    hive>insert into table testTableNew values (1,'row1'),(2,'row2'),(3,'row3');
    

    업데이트 :

    hive>update testTableNew set name = 'updateRow2' where id = 2;
    

    삭제 :

    hive>delete from testTableNew where id = 1;
    

    테스트 :

    hive>select * from testTableNew ;
    
  10. ==============================

    10.UPDATE 또는 DELETE 레코드는 하이브에서는 허용되지 않지만 INSERT INTO는 허용됩니다. Hadoop의 발췌 문장 : The Definitive Guide (제 3 판) :

    UPDATE 또는 DELETE 레코드는 하이브에서는 허용되지 않지만 INSERT INTO는 허용됩니다. Hadoop의 발췌 문장 : The Definitive Guide (제 3 판) :

  11. ==============================

    11.최근 Hive 버전 0.14에서 삭제가 추가되었습니다. ACID를 지원하는 테이블에서만 삭제가 수행됩니다. 아래는 Apache의 링크입니다.

    최근 Hive 버전 0.14에서 삭제가 추가되었습니다. ACID를 지원하는 테이블에서만 삭제가 수행됩니다. 아래는 Apache의 링크입니다.

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Delete

  12. ==============================

    12.귀하의 현재 필요를 달성하기 위해, 당신은 질문 아래에 발사해야합니다

    귀하의 현재 필요를 달성하기 위해, 당신은 질문 아래에 발사해야합니다

    > insert overwrite table student 
    > select *from student 
    > where id <> 1;
    

    그러면 현재 테이블이 삭제되고 제외 / 삭제할 행을 제외한 모든 행과 이름이 같은 새 테이블이 만들어집니다

    나는 하이브 1.2.1에서 이것을 시도했다.

  13. ==============================

    13.좋은 소식, Kudu를 사용하여 Hive / Impala에서 업데이트를 삽입하고 삭제할 수 있습니다.

    좋은 소식, Kudu를 사용하여 Hive / Impala에서 업데이트를 삽입하고 삭제할 수 있습니다.

    IMPALA / kudu를 사용하여 테이블을 유지 관리하고 레코드 삽입 / 업데이트 / 삭제를 수행해야합니다. 예제가있는 세부 정보는 다음에서 찾을 수 있습니다. insert-update-delete-on-hadoop

    흥분되는 경우 뉴스를 공유하십시오.

    - 마이크

  14. ==============================

    14.최근 아파치 하이브와 유사한 문제를 해결하기 위해 Hadoop은 업데이트 / 삭제 작업을 지원하지 않습니다. 그래서? 따라서 두 가지 방법이 있습니다.

    최근 아파치 하이브와 유사한 문제를 해결하기 위해 Hadoop은 업데이트 / 삭제 작업을 지원하지 않습니다. 그래서? 따라서 두 가지 방법이 있습니다.

    포인트 1의 예 :

    Create table bck_table like input_table;
    Insert overwrite table bck_table 
        select * from input_table;
    Truncate table input_table;
    Insert overwrite table input_table
        select * from bck_table where id <> 1;
    

    주의 : input_table이 외부 테이블 인 경우 다음 링크를 따라야합니다. 하이브에서 파티션 된 외부 테이블을 자르는 방법?

  15. from https://stackoverflow.com/questions/17810537/how-to-delete-and-update-a-record-in-hive by cc-by-sa and MIT license