2017-06-23 7 views
0

私は、1行に1つのJSONオブジェクトとしてフォーマットされた一連のファイルを入力として持っています。しかし、問題は、これらのJSONオブジェクトの1つのフィールドがJSONエスケープ文字列であることです。私たちは「escapedJsonPayloadは」文字列であると私はそれが構造体である必要が見ることができるように例Spark - JSONエスケープされたStringフィールドをDataFramesのJSONオブジェクトとして解析する方法

私はJSONファイルを読み込むことで、データフレームを作成すると
{"clientAttributes":{"backfillId":null,"clientPrimaryKey":"abc"},"escapedJsonPayload":"{\"name\":\"Akash\",\"surname\":\"Patel\",\"items\":[{\"itemId\":\"abc\",\"itemName\":\"xyz\"}"} 

は、それが

val df = spark.sqlContext.read.json("file:///home/akaspate/sample.json") 
df: org.apache.spark.sql.DataFrame = [clientAttributes: struct<backfillId: string, clientPrimaryKey: string>, escapedJsonPayload: string] 

以下のようにデータフレームを作成しています。

注:私はStackOverflowの中で同様の質問を持って、それに続く(How to let Spark parse a JSON-escaped String field as a JSON Object to infer the proper structure in DataFrames?)が、それは私を与えている "[_corrupt_record:文字列]" 私は以下試してみました

  1. val df = spark.sqlContext.read.json("file:///home/akaspate/sample.json") (Work file)

  2. ステップ
  3. val escapedJsons: RDD[String] = sc.parallelize(Seq("""df"""))

  4. val unescapedJsons: RDD[String] = escapedJsons.map(_.replace("\"{", "{").replace("\"}", "}").replace("\\\"", "\""))

  5. val dfJsons: DataFrame = spark.sqlContext.read.json(unescapedJsons) (This results in [_corrupt_record: string])

すべてのヘルプは、あなたが提供しているすべてのJSONの

答えて

0

まず、間違ったフォーマット(構文的に)であるいただければ幸いです。次のように修正JSONは次のとおりです。コードの上

val rdd = spark.read.textFile("file:///home/akaspate/sample.json").toJSON.map(value => value.replace("\\", "").replace("{\"value\":\"", "").replace("}\"}", "}")).rdd 

val df = spark.read.json(rdd) 

出力、次のあなたを与える:

{"clientAttributes":{"backfillId":null,"clientPrimaryKey":"abc"},"escapedJsonPayload":{\"name\":\"Akash\",\"surname\":\"Patel\",\"items\":[{\"itemId\":\"abc\",\"itemName\":\"xyz\"}]}} 

次に、上記のJSONから正しくJSONをパースするには、次のコードを使用する必要があります次のスキーマで

df.show(false) 

+----------------+-------------------------------------+ 
|clientAttributes|escapedJsonPayload     | 
+----------------+-------------------------------------+ 
|[null,abc]  |[WrappedArray([abc,xyz]),Akash,Patel]| 
+----------------+-------------------------------------+ 

df.printSchema 

root 
|-- clientAttributes: struct (nullable = true) 
| |-- backfillId: string (nullable = true) 
| |-- clientPrimaryKey: string (nullable = true) 
|-- escapedJsonPayload: struct (nullable = true) 
| |-- items: array (nullable = true) 
| | |-- element: struct (containsNull = true) 
| | | |-- itemId: string (nullable = true) 
| | | |-- itemName: string (nullable = true) 
| |-- name: string (nullable = true) 
| |-- surname: string (nullable = true) 

私はこれが助けてくれることを願っています!

+0

この回答はあなたの問題を解決していますか? – himanshuIIITian

+0

詳細な回答はhimanshuIIITian @に感謝します。 「最初に提供したJSONの形式が間違っています(構文的に)」という点については、この入力ファイルを管理することはできず、アップストリームサービスからこの形式を取得しています。したがって、 "escapedJsonPayload"のように表示されます: "{\" name \ ":\" Akash \ "}"。 スパークでこれを処理する方法をお知らせください。 –

+0

Simple ... JSON値に 'replace(" \\ "、" ")'を適用するだけです。私の答えに言及したように。 – himanshuIIITian

関連する問題