2016-08-04 6 views
0

데이터 프레임에 99 230/256과 같은 값을 가진 열이 있습니다. 분수가있는 String입니다. 이중 표현은 99.8984375입니다.문자열 (분수 포함)을 Spark에서 Double로 변환

Spark에서 이러한 문자열을 Double로 변환하는 변환을 적용하려면 어떻게해야합니까? Spark 1.6.2를 사용 중입니다.

+1

구문 분석을 위해 udf를 만들어 소수 값을 계산하고 double을 반환해야합니다. – eliasah

+0

예. 나는 동의한다. 내가 미리 정의 된 방법으로 처리 할 수 ​​있는지 찾고 있었지만 당신은 맞습니다. – Veenit

답변

2

참고 : 데이터에 적용 할 함수를 직접 정의해야합니다. 스파크는 단지 그것을 사용합니다. 당신이 요구하는 것을 수행하는 것은 내장 된 기능이 아닙니다.

사용중인 API를 지정하지 않았으므로 다음은 간단한 컬렉션에 대한 Python 응답입니다.

또한 Spark 외부에서 실행하고 테스트 할 수 있습니다. 여기

def convertFrac(frac): 
    parts = frac.split() 
    whole = numer = 0 
    denom = 1 
    if len(parts) == 2: 
     whole = float(parts[0]) 
     numer, denom = map(float, parts[1].split('/')) 
    elif len(parts) == 1: 
     if '/' in parts[0]: 
      numer, denom = map(float, parts[0].split('/')) 
     else: 
      return float(parts[0]) 
    return whole + (numer/denom) 

>>> sc.parallelize(["99 230/256", "1/100"]).map(convertFrac).collect() 
[99.8984375, 0.01] 

경고,이 모든 입력 ("-2 -3/5"로 기록 될 "-2 3/5" 요구와 같은 특히 제외)에서 작동하지 않는 샘플 실행 - 그것은 당신이 필요의 예입니다 할 것.

+0

Scala API를 사용하고 있지만 확실히 도움이됩니다. 음수 값의 범위도 없으므로 함수가 완벽하게 작동합니다. 또한,'spark-sql'의'select' 절 (좋은 생각인지 확실하지 않음)에서 컬럼을 조작하기로 결정했으나 sql (개인 선호도)에서 훨씬 쉽게 찾을 수있었습니다. 코드를 가져 주셔서 감사합니다. – Veenit

+0

Gotcha. 네, 단순한 값 캐스팅과 문자열 분할입니다. 너무 복잡한 것은 아닙니다. –