Spark 1.5, 1.6에서는 json4s는 3.2.x만 쓸 수 있다. 

json4s를 작업하다가 다음과 같은 에러를 만났다. 



org.apache.spark.SparkException: Task not serializable

at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:304)

at org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:294)

at org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:122)

at org.apache.spark.SparkContext.clean(SparkContext.scala:2055)

at org.apache.spark.rdd.RDD$$anonfun$flatMap$1.apply(RDD.scala:333)

at org.apache.spark.rdd.RDD$$anonfun$flatMap$1.apply(RDD.scala:332)

at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)

at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111)

at org.apache.spark.rdd.RDD.withScope(RDD.scala:316)

at org.apache.spark.rdd.RDD.flatMap(RDD.scala:332)

at stat.googleStat2$.run(CommentStat2.scala:29)


Caused by: java.io.NotSerializableException: org.json4s.DefaultFormats$

Serialization stack:

- object not serializable (class: org.json4s.DefaultFormats$, value: org.json4s.DefaultFormats$@2b999ee8)

- field (class: stat.CommentStat2$$anonfun$2, name: formats$1, type: class org.json4s.DefaultFormats$)

- object (class stat.CommentStat2$$anonfun$2, <function1>)

at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)

at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:47)

at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:101)

at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:301)




아래와 같은 형태로 암시 formats를 재활용해서 쓰려 했는데.. 에러가 발생했다.


 implicit val formats = DefaultFormats

 

 

 class MyJob {

  implicit val formats = DefaultFormats


   RDD.map(x => x.extract[Double])

   .filter(y => y.extract[Int] == 18)

}





해결하려면, 다음처럼 formats를 각 메소드에서 선언해서 써야 한다.


class MyJob {

   RDD.map({x =>

     implicit val formats = DefaultFormats

     x.extract[Double]

    })

   ...

   .filter({ y =>

     implicit val formats = DefaultFormats

     y.extract[Int] == 18

    })


}



황당스럽지만, DefaultFormats의 슈퍼 타입인 Formats가 3.3부터 Serialziable을 상속받았다.

(DefaultFormats은 json4s 3.3부터 serialzable을 지원한다. )


trait Formats extends Serializable


https://github.com/json4s/json4s/commit/961fb27f5e69669fddc6bae77079a999fc6f04a1





하지만, Spark 1.5, 1.6을 쓰고 , json4s 3.2를 쓰는 사람 입장에서는 불편하지만 저렇게 써야 한다. 



Posted by '김용환'
,




scala에서 json4s를 간단하게 사용할 때, Map[String, Any]으로 파싱할 때 특별히 에러가 발생하지 않는다.


간단히 동작하는 예시는 다음과 같다. 



import
org.json4s._
import org.json4s.JsonAST.{JObject, JValue}
import org.json4s.jackson.{Json, JsonMethods}

implicit val formats = DefaultFormats
val source = """{"comment_type":"general"}"""
val commentType = JsonMethods.parse(source) .extract[Map[String, Any]].get("comment_type")
println(commentType)



하지만, Spark에서 사용하면 에러가 발생한다. 


org.json4s.package$MappingException: No usable value for... 




이런 비슷한 얘기가 json4s 이슈에 있다. 

https://github.com/json4s/json4s/issues/124




그래서 Map이 아닌 case class를 사용하면 또 에러가 발생한다. 


기본 값을 넣어줘야 에러가 발생하지 않는다. 



case class Comment(comment_type: String = "general")


좀 더 고급스럽게 Option을 추가한다.


case class Comment(comment_type: Option[String] = Some("general"))



 잘 동작한다. Map 대신 case class를 사용하기를 추천한다. 


import org.json4s._
import org.json4s.JsonAST.{JObject, JValue}
import org.json4s.jackson.{Json, JsonMethods}

case class Comment(comment_type: Option[String] = Some("general"))

implicit val formats = DefaultFormats
val source = """{"comment_type":"general"}"""
val commentType = JsonMethods.parse(source).extract[Comment].comment_type
println(commentType)



Spark에서 이렇게 쓰면 아주 잘 작동할 것 같았지만, 이슈가 있다. 다른 필드 파싱할 때, 예상되는 타입과 실제 값과의 차이로 파싱 에러가 발생할 수 있다.



이럴 때는 Try문를 추가하고, Comment에 해당되는 모든 필드에 대해서 Option 처리를 추가해야 한다. 어떤 값과 상관없이 처리할 수 있도록 해야 한다.


case class Comment(comment_type: Option[String] = Some("general"), action: Option[String] = Some("create", ....)

Posted by '김용환'
,


scala의 json4s 사용시 아래와 같은 에러가 발생하면, 필드에 대한 오타가 발생했다.



Exception in thread "main" org.json4s.package$MappingException: No usable value for xxx

Did not find value which can be converted into java.lang.String


예를 들어, json source의 내용의 comment_type이고, case class은 comments_type으로 잘못 매핑 구조를 만들면, 에러가 발생한다. 



예)


val source = """{"comment_type":"general"}"""



case class Comment(comments_type: String)

JsonMethods.parse(source).extract[Comment].comment_type


Posted by '김용환'
,




참고 : http://www.artima.com/articles/dci_vision.html


객체는 폴리모피즘, 커플링, 응집도가 아니라, 사람들과 사람들의 멘탈 모델에 대한 내용이다. 


MVC는 멘탈 모델이지 관찰자 패턴이 아니다.












참고 http://dm-academy.github.io/aitm/aitm-instructor.html


In this situation, each person has their own “mental model” of what needs to be done, and their own tracking mechanism. We don’t know how the work is being transmitted: emails, phone calls, hallway conversations (”Say Sara, there is an issue with Customer X’s bill, can you please look into it?”)







참고 : http://designbyforest.tistory.com/entry/UX%EB%AA%A8%EB%93%A0-%EA%B8%B0%ED%9A%8D%EC%9E%90%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B4%EB%84%88%EA%B0%80-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EC%82%AC%EB%9E%8C%EC%97%90-%EB%8C%80%ED%95%9C-100%EA%B0%80%EC%A7%80%EC%82%AC%EC%8B%A4



03 사람들은 패턴 인식을 통해 사물을 인식한다.
-사람은 자동적으로 패턴을 찾음. 분류와 공백을 이용 패턴을 만들어 내는것이 좋음.
-아이콘 요소는 인지하게 만드는게 쉽고, 빠르게 인지하게 함.
-평면보다는 입체를 더 잘 인지. 단, 화면상에  표현된 입체 요소를 인지하고 이해하는 속도는 평면 요소에 비해 느릴수도 있음.


멘탈모델이란?
실세계의 특정 대상물이 어떻게 작동하는지에 대한 사람의 사고 과정에 대한 설명.
디자인 모델 - 디자이너의 개념모델을 말함.
사용자 모델 - 사용자가가 시스템과 상호 작용하는 과정에서 만들어낸 멘탈모델을 말함.


28 특정 유형의 인지 처리 과정은 더욱 까다롭다.
- 디자인할 때 사용자가 많이 생각하거나 기억하지 않아도 되게 한다. 이 두 가지는 인지 부하를 일으켜 많은 정신적 자원을 필요로 한다.
- 기회 비용에 대해 고민하라. 예를 들어 시각 부하나 운동 부하를 높여 인지 부하를 줄일 수 있는 곳이 있다.
- 사람이 선택하는 항목을 충분히 키워서 쉽게 도달할 수 있게 만든다.







참고 : http://egloos.zum.com/hisprite/v/3810333


멘탈모델은 
일. 서비스나 제품 기획에 지침이 될 수 있고
이. 사용자와 사업을 위해서 좋은의사결정을 내리도록 도와주며
삼. 장기적인 비전과 기회를 제시해 준다.







참고 : http://blog.naver.com/PostView.nhn?blogId=vinylx&logNo=220171087380&redirect=Dlog&widgetTypeCall=true


정의 및 가치

멘탈 모델의 활용 가치는 발생할 수 있는 문제점을 미리 파악하고, 통합적인 서비스 이해를 바탕으로 해결 방안을 도출할 수 있다는 데 있습니다. 이 모델은 이전 포스트에서 소개된 ‘친화도 맵’이라고도 불리는 ‘어피니티 다이어그램(Affinity Diagram) - 사용자의 공통된 행동자료를 의미상 가까운 것끼리 모아 놓은 다이어그램’과도 밀접한 관련이 있습니다. 즉, 다른 사람의 행동 동기, 사고 과정을 비롯한 감성적, 철학적 배경을 이해하기 위하여 그들과 대화하고, 행동 패턴을 도출하여 정리한 것이 ‘멘탈 모델’ 입니다. 여기서는 ‘행동(task)’이라는 단어는 행위, 생각, 기분, 철학 그리고 동기에 이르기까지 사람이 무언가를 이루거나, 무언가를 움직이거나, 특정한 상태에 이를 때 나타나는 모든 것을 포괄하는 의미로 정의하도록 하겠습니다.













Posted by '김용환'
,