2014-05-19 3 views
0

iconv를 통해 UTF8로 변환 한 다음 커다란 csv 파일을 가지고 Mongo에로드했습니다. ReactiveMongo/Scala를 사용하여 데이터를 쿼리하는 동안 많은 오류가 발생합니다. 일부 레코드는 BSONDouble 및 BSONLong으로 가치가있는 것으로 보입니다. 쿼리를 검색하면 오류가 발생합니다. 전환을 시도하면 BSONDouble을 BSONLong 또는 다른 방법으로 변환 할 수 없습니다. 어떤 아이디어?ReactiveMongo BSONDouble 대 BSONLong

답변

0

이것은 토끼 구멍에서 멀리 떨어진 곳에서 나를 데려갔습니다. mongoimport가 저장 한 숫자 중 일부는 BSONDouble 또는 BSONLong 또는 BSONInteger 였을뿐만 아니라 일부는 BSONString이었습니다. 처음에는 BSONNumberLike 검사를 사용했지만 작은 데이터 세트에서 작동했지만, mongo에서 더 큰 데이터 세트로 전환하면 Null 포인터 예외로 인해 충돌했습니다. 나는 [BSONLong] .colName을 doc.get 사용 된

case class Aggsecrow (
    Strategy: String, 
    Security: String, 
    LocalPosn: Double, 
    USDPosn: Double, 
    CurrentPx: Double, 
    USDMV: Double, 
    PNL: Double 
) 

object Aggsecrow { 
    implicit object AggsecrowBSONReader extends BSONDocumentReader[Aggsecrow] { 
    def safeNumGet(field: String, doc: BSONDocument): Double = { 
     var dtry = doc.getAsTry[BSONNumberLike](field) 
     var d = 0.0 
     if(dtry.isFailure) { 
     val stry = doc.getAsTry[BSONString](field) 
     val strConv = stry.get.value 
     val doubleConv = Double.valueOf(strConv).longValue 
     d = doubleConv.doubleValue 
     } else { 
     d = try {dtry.get.toDouble} catch { case _ => 0.0} 
     } 
     d 
    } 

    def read(doc: BSONDocument) :Aggsecrow = { 
     Aggsecrow(
     doc.getAsTry[String]("Strategy").get, 
     doc.getAsTry[String]("Security").get, 
     safeNumGet("LocalPosn",doc) , 
     safeNumGet("USDPosn",doc) , 
     safeNumGet("Current",doc) , 
     safeNumGet("USDMV",doc) , 
     safeNumGet("PNL",doc) , 
    } 
    } 
+0

이 새로운 함수는 1e7과 같은 지수 함수를 처리합니다. –

2

일부 코드가 표시되지 않으면 도움이되지 않습니다. 귀하의 문서에 대해 BSONDocumentReader을 쓰고 있다고 가정하고 ABSONDouble 또는 BSONLongBSONDocument.getAs[A]으로 전화를 걸고 유형이 일치하지 않으면 실패합니다.

BSONDocument.getAsTry[A]을 사용하는 편도는 Try[A]을 반환하고 Failure 인 경우 다른 유형을 시도해야한다는 것을 알고 있습니다.

+0

예 : 더 읽기 및 반환 BSONs을보고 한 후,이 코드는 더 방탄 (또는 적어도 내 대규모 데이터 세트와 함께 일하고있다) 것 같다 나는 오늘 getAsTry로 전환했다. 나는 일할 수도있는 또 다른 길을 가지고있다. 지금 테스트하기 –

관련 문제