복붙노트

[HADOOP] 쿼리 결과에 정수 고유 ID를 추가하는 방법-__efficiently__?

HADOOP

쿼리 결과에 정수 고유 ID를 추가하는 방법-__efficiently__?

조회가 제공되면 * from ... (CTAS 문의 일부일 수 있음)를 선택하십시오.

목표는 추가 열 ID를 추가하는 것입니다. 여기서 ID는 고유 한 정수입니다.

select ... as ID,* from ...

추신.

row_number는 논리적으로 문제를 해결합니다-

select row_number() over () as ID,* from ...

문제는 적어도 현재로서는 전역 row_number (파티션 없음)가 단일 감속기 (하이브) / 작업 (스파크)을 사용하여 구현되고 있다는 것입니다.

해결법

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

    1.하이브

    하이브

    set mapred.reduce.tasks=1000;
    set hivevar:buckets=10000;
    

    hivevar : buckets는 리듀서 (mapred.reduce.tasks)의 수에 비해 충분히 높아야하므로 로우가 리듀서간에 균등하게 분배됩니다.

    select  1 + x + (row_number() over (partition by x) - 1) * ${hivevar:buckets}  as id
           ,t.*
    
    from   (select  t.*
                   ,abs(hash(rand())) % ${hivevar:buckets} as x      
    
            from    t
            ) t
    

    스파크 SQL

    select  1 + x + (row_number() over (partition by x) - 1) * 10000  as id
           ,t.*
    
    from   (select  t.*
                   ,abs(hash(rand())) % 10000 as x      
    
            from    t
            ) t
    

    하이브와 스파크 SQL 모두

    rand ()는 좋은 분포를 생성하는 데 사용됩니다. 쿼리에 분산이 좋은 열 / 열 조합이 이미있는 경우 (독립적 일 수는 없지만) 대신 사용할 수 있습니다 (예 : -

    select    1 + (abs(hash(col1,col)) % 10000) 
            + (row_number() over (partition by abs(hash(col1,col)) % 10000) - 1) * 10000  as id
           ,t.*
    
    from    t
    
  2. ==============================

    2.Spark-sql을 사용하는 경우 가장 좋은 방법은 내장 함수를 사용하는 것입니다.

    Spark-sql을 사용하는 경우 가장 좋은 방법은 내장 함수를 사용하는 것입니다.

    monotonically_increasing_id

    별도의 열에 고유 한 임의의 ID를 생성합니다. 그리고 당신이 말했듯이 순차적 일 필요는 없으므로 이상적으로 요구 사항을 충족시켜야합니다.

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

    3.Manoj Kumar에서이 솔루션을 확인하십시오 : https://github.com/manojkumarvohra/hive-hilo

    Manoj Kumar에서이 솔루션을 확인하십시오 : https://github.com/manojkumarvohra/hive-hilo

    용법:

    FunctionName( sequenceName, lowvalue[optional], seedvalue[optional])
    
  4. ==============================

    4.전 세계적으로 고유 한 ID 서비스 https://github.com/spinaki/distributed-unique-id에 대해 확인하십시오 도커 이미지도 있으므로 빠르게 테스트 할 수 있습니다.

    전 세계적으로 고유 한 ID 서비스 https://github.com/spinaki/distributed-unique-id에 대해 확인하십시오 도커 이미지도 있으므로 빠르게 테스트 할 수 있습니다.

  5. from https://stackoverflow.com/questions/42974548/how-to-add-an-integer-unique-id-to-query-results-efficiently by cc-by-sa and MIT license