2016-10-01 4 views
0

Spark의 ml 라이브러리에서 HashingTF에서 가져온 DataFrame [SparseVector] 있습니다. - 기능 1 = 2147483647 번호 (최대)Spark의 Dataframe [SparseVector]에서 0이 아닌 값을 모두 얻는 방법?

root 
|-- docId: string (nullable = true) 
|-- docNGrams: array (nullable = true) 
| |-- element: string (containsNull = true) 
|-- HashedNGrams: vector (nullable = true) 

HashedNGrams 2^(31)의 스파 스 벡터입니다 : 다음 내 스키마입니다. HashedNGrams의 예는 다음과 같습니다 그래서 몇 가지 조작을 할 수있는 무엇이든, 벡터, 목록 [지능],이 DataFrame에서

70921,235056 
6067499,8758008 
..... , ... 

:

[doc/00000.txt,(2147483647,[70921,235056,....],[1.0,2.0,...]) 
[doc/00001.txt,(2147483647,[6067499,8758008,....],[1.0,1.0,...]) 
...... 
...... 

는 내가 원하는 것은 그냥 값을 얻을 수 있습니다 자료. 내가 지금까지 시도한 것은 : 1) 밀도가 높은 벡터로 변환하려고 시도하지만 한계를 벗어난다. VM 예외 2) 여기에서 찾은 모든 가능한 해결책을 시도했지만 아무런 결점도 없다! 그들은 모두 내게 오류를 제공합니다. 3) 파일에 저장 한 다음이 값을 String으로 취하려고했습니다 (아직 완료하지 않았지만 매우 잘못된 접근이라고 생각합니다).

도와주세요!

당신은 사용자 정의 함수 값의 배열로 SparseVector 변환 (UDF)를 사용할 수 있습니다
+0

귀하의 경우에는 '70921,235056'은 값이 아닌 색인입니다. – zero323

답변

0

- 여기이 배열 values라는 새 열을 추가하는 방법은 다음과 같습니다

import org.apache.spark.sql.functions._ 

val valuesOnly = udf { s: SparseVector => s.values } 
val result = df.withColumn("values", valuesOnly(col("HashedNGrams"))) 

UPDATE을 : 언급 한 바와 같이 @ zero323에 의해, OP는 실제로 인덱스 다음이며 값이 아닙니다. 주석으로, UDF에서 s.values 대신 s.indices을 사용하면 쉽게 구현할 수 있습니다.

+0

대단히 감사합니다 !!! 두 답변 (당신과 @ zero323)의 조합으로 나는 내가 원하는 것을 얻었습니다. 나는 나이를 찾고 있었다! 'import org.apache.spark.sql.functions._ val valuesOnly = udf {s : SparseVector => s.indices} 값 결과 = df.withColumn ("values", valuesOnly (col ("HashedNGrams")))' – Spartan

+0

도움이 된 것을 기쁘게 생각합니다. 실제로 예제의 예상 값이 실제로 인덱스 였음을 알지 못했습니다. 다른 사용자가이 질문에 답을 얻었음을 알리는 응답을 upvote/accept 할 때 도움이 될 것입니다. –

+0

나는 그랬다! 그러나 그것은 나에게 준다 : 15 명 미만의 평판에 의한 투표는 기록되지만, 게시 된 점수의 홍보는 변경하지 않는다. – Spartan

관련 문제