2016-07-28 5 views
0

私は私のレコードを解析する機能を作成しようとしていますし、私はそれをハードコーディング対関数を呼び出すとき、私は2つの異なる動作を取得しています:私は使用していますScalaの構文解析JSON機能で異なる動作を

を:

import org.json4s.JsonAST.{JString, JField, JObject, JArray} 
import org.json4s.jackson.JsonMethods._ 

val parsed = parse("""{"timestamp":"2016-06-02 13:40:16,772","tableName":"stg_mde_campaign_master","dbName":"stg_bankrtl_mde","owner":"hive","location":"null"}""") 
     val output = for { 
     JObject(child) <- parsed 
     JField("timestamp", JString(subject1)) <- child 
     JField("tableName", JString(obj1)) <- child 
     } yield (subject1,obj1) 

ウィル出力(私が欲しいもの):

output: List[(String, String)] = List((2016-06-02 13:40:16,772,stg_mde_campaign_master) 

が、私は、私は取得しています機能に転送:

def getSubOb(record: String, subject:String, obj:String): List[(String, String)] = { 
     val parsed = parse(record) 
     val output: List[(String, String)] = for { 
     JObject(child) <- parsed 
     JField(subject, JString(subject1)) <- child 
     JField(obj, JString(obj1)) <- child 
    } yield (subject1, obj1) 
     output 
    } 
val something = getSubOb("""{"timestamp":"2016-06-02 13:40:16,772","tableName":"stg_mde_campaign_master","dbName":"stg_bankrtl_mde","owner":"hive","location":"null"}""", "timestamp", "tableName") 

出力は非常に奇妙な行為:

something: List[(String, String)] = List((2016-06-02 13:40:16,772,2016-06-02 13:40:16,772), (2016-06-02 13:40:16,772,stg_mde_campaign_master), (2016-06-02 13:40:16,772,stg_bankrtl_mde), (2016-06-02 13:40:16,772,hive), (2016-06-02 13:40:16,772,null), (stg_mde_campaign_master,2016-06-02 13:40:16,772), (stg_mde_campaign_master,stg_mde_campaign_master), (stg_mde_campaign_master,stg_bankrtl_mde), (stg_mde_campaign_master,hive), (stg_mde_campaign_master,null), (stg_bankrtl_mde,2016-06-02 13:40:16,772), (stg_bankrtl_mde,stg_mde_campaign_master), (stg_bankrtl_mde,stg_bankrtl_mde), (stg_bankrtl_mde,hive), (stg_bankrtl_mde,null), (hive,2016-06-02 13:40:16,772), (hive,stg_mde_campaign_master), (hive,stg_bankrtl_mde), (hive,hive), (hive,null), (null,2016-06-02 13:40:16,772), (null,stg_mde_campaign_... 
+0

郵便いくつかrunableコードを。 – Falmarri

+0

インポートステートメントを追加しましたが、他はすべて実行可能です – theMadKing

答えて

1

あなたはunapplyにsubteleエラーを持っています。

パターンマッチングの左側の小文字の用語は、変数として扱われます。 すべてが一致し、そこにバインドされています。

変数名のようにバッククォートを使用して、バインドされる変数ではなく、マッチするパターンの左側で照合される値をScalaに伝えることができます。

は、以下を参照してください。意図したとおりにlowercased variables in pattern matching

これは動作するはずです:

def getSubOb(record: String, subject:String, obj:String): List[(String, String)] = for { 
    JObject(child) <- parse(record) 
    JField(`subject`, JString(subject1)) <- child 
    JField(`obj`, JString(obj1)) <- child 
} yield (subject1, obj1)