2016-09-28 52 views
2

是否可以分解Spark數據幀列?因式分解我的意思是創建列中每個唯一值到同一個ID的映射。因式分解Spark列

爲例,原來的數據幀:

+----------+----------------+--------------------+ 
|  col1|   col2|    col3| 
+----------+----------------+--------------------+ 
|1473490929|4060600988513370|     A| 
|1473492972|4060600988513370|     A| 
|1473509764|4060600988513370|     B| 
|1473513432|4060600988513370|     C| 
|1473513432|4060600988513370|     A| 
+----------+----------------+--------------------+ 

到因式分解版本:

+----------+----------------+--------------------+ 
|  col1|   col2|    col3| 
+----------+----------------+--------------------+ 
|1473490929|4060600988513370|     0| 
|1473492972|4060600988513370|     0| 
|1473509764|4060600988513370|     1| 
|1473513432|4060600988513370|     2| 
|1473513432|4060600988513370|     0| 
+----------+----------------+--------------------+ 

斯卡拉它本身是相當簡單的,但由於星火分配它dataframes在節點我不是確定如何保持A->0, B->1, C->2的映射。

此外,假設數據幀非常大(千兆字節),這意味着將單個機器的整個列加載到內存中可能是不可能的。

可以這樣做嗎?

回答

3

您可以使用StringIndexer編碼字母爲指數:

import org.apache.spark.ml.feature.StringIndexer 

val indexer = new StringIndexer() 
    .setInputCol("col3") 
    .setOutputCol("col3Index") 

val indexed = indexer.fit(df).transform(df) 
indexed.show() 

+----------+----------------+----+---------+ 
|  col1|   col2|col3|col3Index| 
+----------+----------------+----+---------+ 
|1473490929|4060600988513370| A|  0.0| 
|1473492972|4060600988513370| A|  0.0| 
|1473509764|4060600988513370| B|  1.0| 
|1473513432|4060600988513370| C|  2.0| 
|1473513432|4060600988513370| A|  0.0| 
+----------+----------------+----+---------+ 

數據:

val df = spark.createDataFrame(Seq(
       (1473490929, "4060600988513370", "A"), 
       (1473492972, "4060600988513370", "A"), 
       (1473509764, "4060600988513370", "B"), 
       (1473513432, "4060600988513370", "C"), 
       (1473513432, "4060600988513370", "A"))).toDF("col1", "col2", "col3") 
+0

完美的,就像一個魅力!完全忘了spark-mllib。 – Tim

0

您可以使用用戶定義的函數。

首先創建你所需要的映射:

val updateFunction = udf {(x: String) => 
    x match { 
    case "A" => 0 
    case "B" => 1 
    case "C" => 2 
    case _ => 3 
    } 
} 

而現在你只需要把它應用到你的DataFrame

df.withColumn("col3", updateFunction(df.col("col3"))) 
+0

想象一下有30多個值:)。這將是一個地獄,以維持這一點。 – Tim

+0

功能應該比這個好一點。這只是一個例子;)。 –

+0

我知道,但如果所有的值都是手動指定的,仍然很難保持。 – Tim