복붙노트

[HADOOP] 하이브 : 배열 <string>을 배열 <int>에 캐스팅합니다.

HADOOP

하이브 : 배열 을 배열 에 캐스팅합니다.

나는 두 개의 테이블을 가지고있다.

create table a (
`1` array<string>);

create table b (
`1` array<int>);

나는 테이블을 테이블 b에 놓고 싶습니다 (테이블 b는 비어 있습니다) :

insert into table b
select * from a;

그렇게하면 다음 오류가 발생합니다.

FAILED: SemanticException [Error 10044]: Line 1:18 Cannot insert into
target table because column number/types are different 'b': Cannot
convert column 0 from array<string> to array<int>.

반면 필드가 문자열 및 int 유형 인 경우에는이 오류가 발생하지 않습니다.

배열을 사용하여 캐스트를 수행하는 방법이 있습니까?

해결법

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

    1.explode () 및 collect_list ()를 사용하여 배열을 다시 어셈블합니다.

    explode () 및 collect_list ()를 사용하여 배열을 다시 어셈블합니다.

    초기 문자열 배열 예제 :

    hive> select array('1','2','3') string_array;
    OK
    string_array
    ["1","2","3"]
    Time taken: 1.109 seconds, Fetched: 1 row(s)
    

    배열 변환 :

    hive> select collect_list(cast(array_element as int)) int_array --cast and collect array
           from( select explode(string_array) array_element         --explode array
                   from (select array('1','2','3') string_array     --initial array
                        )s 
               )s;
    

    결과:

    OK
    int_array
    [1,2,3]
    Time taken: 44.668 seconds, Fetched: 1 row(s)
    

    그리고 insert + select 쿼리에 더 많은 열을 추가하려면 다음을 사용하십시오. 측면보기 [외부] :

    select col1, col2, collect_list(cast(array_element as int)) int_array
     from
    (
    select col1, col2 , array_element         
      from table
           lateral view outer explode(string_array) a as array_element         
    )s
    group by col1, col2
    ;
    
  2. ==============================

    2.쉽게. 배열의 크기를 알고 있다면 배열을 수동으로 캐스팅 할 수 있지만 그렇지 않으면 구조체를 사용해야 할 수도 있습니다. 이 비슷한 질문에 대한 내 대답을보십시오.

    쉽게. 배열의 크기를 알고 있다면 배열을 수동으로 캐스팅 할 수 있지만 그렇지 않으면 구조체를 사용해야 할 수도 있습니다. 이 비슷한 질문에 대한 내 대답을보십시오.

    또한 : 나는 다른 대답을 downvote 수는 없지만 하나 이상의 배열과 중첩 선택에 실패합니다.

    배열 요소를 형 변환하고 원래 배열을 재구성하는 대신 모든 요소를 ​​단일 배열로 변환 한 다음 결합합니다. 예:

    hive> select id, my_array from array_table limit 3;
    OK
    10023307    ["0.20296966","0.17753501","-0.03543373"]
    100308007   ["0.16155224","0.1945944","0.09167781"]
    100384207   ["0.025892768","0.023214806","-0.003712816"]
    
    hive> select
        >     collect_list(cast(array_element as double)) int_array
        > from (
        >     select
        >         explode(my_array) array_element
        >     from (
        >         select
        >             my_array
        >         from array_table limit 3
        >     ) X
        > ) s;
    OK
    [0.20296966,0.17753501,-0.03543373,0.16155224,0.1945944,0.09167781,0.025892768,0.023214806,-0.003712816]
    
  3. from https://stackoverflow.com/questions/32871399/hive-casting-arraystring-to-arrayint-in-query by cc-by-sa and MIT license