2016-02-20 71 views
-2

我正在做一些數據預處理。每條線具有以下架構如何動態構建RDD或DataFrame?

<row Att1="...." Att2="..." Attn"...." /> 

但並非所有行中都存在所有屬性。也就是說,有些行可能只有三個屬性,而另一些行有五個屬性,等等。此外,沒有方式屬性指示每行內存在多少屬性。

我想形成一個RDD或DataFrame(prefrable)並對數據運行一些查詢。不過,我找不到分割每一行的好方法。例如,按空間分割不起作用。我在處理中只需要一些屬性。我嘗試使用模式匹配來提取存在於所有行中的4個屬性,如下所示,但失敗。

val pattern = "Att1=(.*) Att3=(.*) Att10=(.*) Att11=(.*)".r 
val rdd1 = sc.textFile("file.xml") 

val rdd2 = rdd1.map {line => line match { 
    case pattern(att1,att2,att3,att4) => Post(att1,att2,att3,att4) 
    } 
} 

case class Post(Att1: String, Att3: String, Att10: String, Att11: String) 

p.s.我正在使用scala。

+1

這太寬泛了,無法在這裏回答。另外,你到目前爲止嘗試過什麼? – eliasah

+0

我更新了我的帖子,至今爲止我做了 –

回答

2

這不是一個火花問題,而是一個scala問題。數據是否存儲在多個文件中?

我會建議通過文件並行化,然後逐行解析。

對於解析我想:

  1. 創建一個案例類的,你要對行看起來像
  2. 創建(這將允許該架構以創建DF時使用反射來推斷)什麼(「屬性」,正則表達式)
  3. 在正則表達式列表中映射並轉換爲映射:(Attribute - > Option [Value])
  4. 創建案例類對象
  5. This應該導致List [CaseClass]或RDD [CaseClass]的數據結構可以轉換爲數據幀。您可能需要執行額外的處理來過濾掉不需要的行並刪除選項。
+0

謝謝,沒有數據存儲在一個文件中。但是你可以向我展示這些步驟的一些示例代碼,因爲我對spark和scala都是新手。 –

+0

你能看看我做了什麼,並告訴我我做錯了什麼嗎? –