2016-12-28 103 views
1

我有一個包含超過百萬條記錄的產品信息文件。 CSV文件看起來像: 如何使用spark替換列內容

 
    Product CategoryName SalesUnit Other Columns... 
     p1   a12    41
p2 x5 72
p3 x5 69
p4 c21 80
p5 b16 59
p6 x5 75 .. .. ..
而且我有一個映射文件(CategoryCode < - > CategoryName),如下所示。映射文件總共有200條記錄:
 
    CategoryCode CategoryName
1.0 a12
2.0 b13 3.0 b16 4.0 c12
5.0 c21
6.0 x5
.. ..
最後,我想用CategoryCode替換類別名稱的值:
 
    Product Category SalesUnit Other Colulmns.. 
    p1   1.0   41
p2 6.0 72
p3 6.0 69
p4 5.0 80
p5 3.0 59
p6 6.0 75 .. .. ..
我的做法是用火花數據框的UDF:
 
    udf { (CategoryName: String) => 
     if (CategoryName.trim() == "a12") 1.0 
     else if (CategoryName.trim() == "b13") 2.0 
     else if (CategoryName.trim() == "b16") 3.0 
     else if (CategoryName.trim() == "c12") 4.0 
     else if (CategoryName.trim() == "c21") 5.0 
     else if (CategoryName.trim() == "x5") 6.0 
     else if (CategoryName.trim() == "z12") 7.0 
     else if (...) ... 
     ... ... 
     else 999.0 
    } 
任何其他優雅的方式來實現的更換無需通過編碼這麼多,如果... else子句?謝謝。

回答

3

加入映射文件與修剪類的CSV然後只選擇你需要

+0

謝謝,你的方法比我的更好。 :) –

2

的類別名稱,您可以加入這兩個數據框,然後刪除類別名稱本身作爲你不需要它之後的字段。

你可以做這樣的事情:

scala> //Can have more columns , have taken just these columns just to demonstrate 

scala> val df1=sc.parallelize(Seq(("p1","a12",41),("p2","x5",72),("p3","x5",69))).toDF("Product","CategoryName","SalesUnit") 
df1: org.apache.spark.sql.DataFrame = [Product: string, CategoryName: string ... 1 more field] 

scala> //Category code dataFrame 

scala> val df2=sc.parallelize(Seq((1.0,"a12"),(4.0,"c12"),(5.0,"c21"),(6.0,"x5"))).toDF("CategoryCode","CategoryName") 
df2: org.apache.spark.sql.DataFrame = [CategoryCode: double, CategoryName: string] 

scala> val resultDF=df1.join(df2,"CategoryName").withColumnRenamed("CategoryCode","Category").drop("CategoryName") 
resultDF: org.apache.spark.sql.DataFrame = [Product: string, SalesUnit: int ... 1 more field] 

scala> resultDF.show() 
+-------+---------+--------+              
|Product|SalesUnit|Category| 
+-------+---------+--------+ 
|  p1|  41|  1.0| 
|  p2|  72|  6.0| 
|  p3|  69|  6.0| 
+-------+---------+--------+ 

P.S:這只是一個小規模示威。

+0

非常感謝您的回答。你的演示對我非常有幫助。我接受Arnon Rotem-Gal-Oz的回答,因爲他很快回應。 –

+0

@JeromeLi:我贊成它! –