[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.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.쉽게. 배열의 크기를 알고 있다면 배열을 수동으로 캐스팅 할 수 있지만 그렇지 않으면 구조체를 사용해야 할 수도 있습니다. 이 비슷한 질문에 대한 내 대답을보십시오.
쉽게. 배열의 크기를 알고 있다면 배열을 수동으로 캐스팅 할 수 있지만 그렇지 않으면 구조체를 사용해야 할 수도 있습니다. 이 비슷한 질문에 대한 내 대답을보십시오.
또한 : 나는 다른 대답을 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]
from https://stackoverflow.com/questions/32871399/hive-casting-arraystring-to-arrayint-in-query by cc-by-sa and MIT license