2015-09-28 69 views
1

我正在使用斯卡拉在Spark中完成ETL過程。 原始日誌文件包含兩列名稱和年齡。我的ETL進程讀取並驗證原始日誌並生成兩個列,即標誌和驗證消息。 標誌列指定行是否有效不是(如果行有效= 1 else 0) 驗證列指定行爲無效的原因。斯卡拉Spark中的ETL過程

Ex。 原始日誌文件

RAM,35 
SAM,45 
JAM,ww 

這裏最後一行是無效的,所以我最終的輸出是

RAM,35,1,"" 
SAM,45,1,"" 
JAM,ww,0,"invalid age" 

我的Scala代碼是

import sqlContext._ 

val people = sc.textFile("hdfs://..../rawT.csv").map(_.split(",")) 

val base_people = people.map{r => val formatted_people = if(r(1).matches("^\\d*$")) ("1","") else ("0","Invalid Age"); (r(0), r(1), formatted_people)} 

但是在這個代碼RDD是越來越爲 產生base_people: org.apache.spark.rdd.RDD[(String, String, (String, String))]

我想要RDD無字符串陣列, base_people: org.apache.spark.rdd.RDD[(String, String, String, String)]

我的邏輯是正確的還是我需要關注一些其他代碼的東西。

回答

1

您正在最後一個位置創建一個三元組,而不是四元組。如何:

val base_people = people 
    .map{r => if(r(1).matches("^\\d*$")) 
       (r(0), r(1), "1", "") 
      else 
       (r(0), r(1), "0", "Invalid Age")} 
+0

感謝您的幫助。這是很好的工作。 –

1

有很多方法可以做你正在努力實現的。這裏是我會做:

val base_people = data.map{ 
    r => r(1) match { 
    case i:Int => (r(0), r(1), "1", "") 
    case s:String => (r(0), r(1), "0", "invalid age") 
    } 
} 

我將使用模式與案例類(智力,字符串,雙等),第二個字段匹配。你可以使用任何適合你的課程。

我希望這有助於!

+0

如果您認爲答案是正確的,您可以對答案進行驗證並進行投票 – eliasah