2017-04-01 36 views
0

我有一個非常大的.tsv文件,有一個有些奇怪的結構,使其具有行是這樣的:轉換任何以JSON在飛行

CA 11[{"id":"missing_required_gtin_future_disapproval","location":"gtin","severity":"critical","timestamp":"2017-02-19T20:57:36Z"}, {"id":"missing_required_gtin_error","location":"gtin","severity":"critical","timestamp":"2017-02-19T20:57:36Z"}]] 

所以,你可以看到,這4列,但第4一個是json對象。

我可以將文件加載到DF的火花:

val df = sqlContext.read.format("com.databricks.spark.csv") 
.option("delimiter", "\t") 
.load(file_path) 

但這:

df.take(1)(0)(3) 

產量:

res53: Any = [{"id":"missing_required_gtin_future_disapproval","location":"gtin","severity":"critical","timestamp":"2017-02-19T20:54:43Z"}, {"id":"missing_required_gtin_error","location":"gtin","severity":"critical","timestamp":"2017-02-19T20:54:43Z"}] 

這使得它(對我來說)困難解析爲json對象。

理想情況下,我想有一個數據框,其中列有他們的JSON對象的鍵:

"id" "location" "severity"   "timestamp" 
123  blabla  critical  2017-02-19T20:54:43Z 
234  blabla  critical  2017-02-19T21:54:43Z 

所以困難是雙重的。

  1. 對於原始文件上的每一行,由於每個json對象都是一個列表,因此我可能在最後一個數據幀上有幾行。
  2. 如何處理json對象?

編輯:

我意識到我是沒有什麼其實我是想很清楚。 我會其實喜歡的是能夠訪問,以及前三欄,以便最終DF看起來是這樣的:

"country " "user" "object" "id" "location" "severity"   "timestamp" 
    CA  98172937 87647563 123  blabla  critical  2017-02-19T20:54:43Z 
    CA  98172937 87647563 234  blabla  critical  2017-02-19T21:54:43Z 

這是最困難的部分,我相信,因爲它涉及到在某種程度上將關於json對象前3列的信息。

+0

你的「JSON」是字符串類型,而不是任何但是take方法把它無需推斷類型。用df.printSchema檢查你的數據模式 – eliasah

回答

2

您可以讀取數據RDD然後變換JSON列的數據幀是這樣的:

val rdd = sc.textFile("path/filet.tsv").map(_.split('\t')(3)) 
val df = sqlContext.read.json(rdd) 
df.printSchema 
    root 
    |-- id: string (nullable = true) 
    |-- location: string (nullable = true) 
    |-- severity: string (nullable = true) 
    |-- timestamp: string (nullable = true) 
+0

非常感謝,非常有幫助。你介意看看EDIT嗎? – elelias

+0

在這種情況下,您可以使用from_json函數將字符串列轉換爲json,查看@ zero323 – Mehrez

+0

建議的原始問題仍然會接受此問題,因爲這是我發佈的問題的正確答案。 – elelias