json4s scala.MatchError (класса scala.Tuple2)

У меня есть собственный класс, который я хочу преобразовать в JSON, но здесь я получаю странную ошибку:

Exception in thread "main" scala.MatchError: (23,com.xxx.dts.dq.common.utils.DQOpsStoreProfileStatus@5f275ae4) (of class scala.Tuple2)

Код здесь:

implicit val formats = org.json4s.DefaultFormats
val A = Serialization.write(resultsMap)
println(A)

Теперь, если я сделаю foreach:

 resultsMap.foreach(x => println(Serialization.write(x)))

Я получаю некоторые результаты, но они не выглядят правильно:

{"_1":23,"_2":{}}
{"_1":32,"_2":{}}

Кортежам не хватает основной информации. Я предполагаю, что пользовательский класс, который мы используем, вызывает какие-то проблемы? Есть ли способ обойти это?

Если бы я вытащил второй элемент карты и преобразовал его в JSON, это выглядело бы так:

{"errorCode":null,"id":null,"fieldType":"STRING","fieldIndex":0,"datasetFieldName":"RECORD_ID","datasetFieldSum":0.0,"datasetFieldMin":0.0,"datasetFieldMax":0.0,"datasetFieldMean":0.0,"datasetFieldSigma":0.0,"datasetFieldNullCount":0.0,"datasetFieldObsCount":0.0,"datasetFieldKurtosis":0.0,"datasetFieldSkewness":0.0,"frequencyDistribution":"(D,4488)","runStatusId":null,"lakeHdfsPath":"/user/jvy234/20140817_011500_zoot_kohls_offer_init.dat"}

Также следует отметить, что класс был написан на Java, если это может быть виновником?

Полная трассировка стека:

Exception in thread "main" scala.MatchError: (0,com.xxx.dts.dq.common.utils.DQOpsStoreProfileStatus@315a29f4) (of class scala.Tuple2)
    at org.json4s.Extraction$.internalDecomposeWithBuilder(Extraction.scala:132)
    at org.json4s.Extraction$.decomposeWithBuilder(Extraction.scala:67)
    at org.json4s.Extraction$.decompose(Extraction.scala:194)
    at org.json4s.jackson.Serialization$.write(Serialization.scala:22)
    at com.xxx.dts.toolset.jsonWrite$.jsonClob(jsonWrite.scala:16)
    at com.xxx.dts.dq.profiling.DQProfilingEngine.profile(DQProfilingEngine.scala:255)
    at com.xxx.dts.dq.profiling.Profiler$.main(DQProfilingEngine.scala:64)
    at com.xxx.dts.dq.profiling.Profiler.main(DQProfilingEngine.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:569)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

person theMadKing    schedule 01.12.2015    source источник
comment
Вы должны увидеть трассировку стека после ошибки, всегда включайте ее в подобные сообщения.   -  person Alexey Romanov    schedule 01.12.2015


Ответы (1)


Я думаю, у вас есть только два пути:

  1. напишите свою сериализацию для tuple2

    or

  2. преобразовать его в карты списка, например: resultsMap.map(Map(_)).foreach(...)

Обновление: для сериализации вы можете использовать что-то вроде этого:

class Tuple2Serializer extends CustomSerializer[(String, Int)](   format => (
    {
      case JObject(JField(k, JInt(v))) => (k, v)
    },
    {
      case (s: String, t: Int) => (s -> t)
    }   ) )

implicit val formats = org.json4s.DefaultFormats + new Tuple2Serializer
person Alexandr Dorokhin    schedule 01.12.2015