2015-01-20 2 views
2

Spark SQL에서 행을 구성하는 레코드 목록을 포함하는 개체가 있습니다 (생각한 사람 Seq[Any]). 에는 .getInt(0) 또는 getString(2)과 같은 서수 접근자가 있습니다.스칼라 서수 메서드 호출 별칭

인사말 0 = ID 및 서수 1 = 이름. 서수가 무엇인지 기억하기가 어려워 지므로 코드를 혼란스럽게 만듭니다.

말은 예를 들어 내가 코드

def doStuff(row: Row) = { 
    //extract some items from the row into a tuple; 
    (row.getInt(0), row.getString(1)) //tuple of ID, Name 
} 

내가 행 객체에서 이러한 필드에 대한 별칭을 어떻게 만들 수된다 질문을 다음습니까?

암시적인 Row 객체를 사용하는 메소드를 만들 수 있다고 생각했습니다.

def id(implicit row: Row) = row.getInt(0) 
def name(implicit row: Row) = row.getString(1) 

그러면 위의 내용을 다음과 같이 다시 쓸 수 있습니다.

def doStuff(implicit row: Row) = { 
    //extract some items from the row into a tuple; 
    (id, name) //tuple of ID, Name 
} 

더 좋게/더 깔끔한 접근 방법이 있습니까?

답변

5

당신은 암시 적으로 행하기 위해 그 접근 방법을 추가 할 수 있습니다

implicit class AppRow(r:Row) extends AnyVal { 
    def id:String = r.getInt(0) 
    def name:String = r.getString(1) 
} 

를 다음으로 사용 :

def doStuff(row: Row) = { 
    val value = (row.id, row.name) 
} 
+0

아, 좋은 지적입니다. 포주를 잊어 버렸습니다. 내 도서관 패턴! – NightWolf

+0

아,'AnyRef'가 아니라'extends AnyVal'이되어서는 안 될까요? 가치 클래스 ... – NightWolf

+0

@NightWolf 네가 맞아! -> 수정 됨. 감사. – maasg

1

또 다른 옵션은 특정 영역의 경우 클래스, 이럴 리드에 를 변환하는 것입니다 더 읽기 쉬운 코드 :