2016-03-21 109 views
-1

我已閱讀了許多Spark示例,但似乎無法找到如何使用CSV文件中的鍵列和多個值列創建RDD。在Spark中使用多列RDD?

我讀了一點關於Spark SQL的內容,並不認爲這是我想要的。我不想用這些數據進行交互式分析,更多的是批處理類型處理。

我對Java或Scala語法感興趣。

您能否指點我正確的方向?

+0

我不同意這是一個太寬泛的問題。我不問如何在Spark中使用CSV,我在問如何做一些更具體的事情。 – AfterWorkGuinness

+0

您是否在尋找類似的東西:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html但在Spark? –

回答

4

多列RDD

有沒有這樣的事情真的,但你也不需要一個。您可以創建任何類型爲T的對象的RDD。這種類型應該模擬一條記錄,所以具有多列的記錄可以是Array[String],Seq[AnyRef]或任何最適合您數據的模型。在Scala中,最好的選擇(對於類型安全和代碼可讀性)通常使用代表記錄的案例類別

例如,如果您的CSV看起來是這樣的:

+---------+-------------------+--------+-------------+ 
| ID  | Name    | Age | Department | 
+---------+-------------------+--------+-------------+ 
| 1  | John Smith  | 29  | Dev   | 
| 2  | William Black  | 31  | Finance  | 
| 3  | Nancy Stevens  | 32  | Dev   | 
+---------+-------------------+--------+-------------+ 

,你可以,例如:

case class Record(id: Long, name: String, age: Int, department: String) 

val input: RDD[String] = sparkContext.textFile("./file") 
val parsed: RDD[Record] = input.map(/* split string and create new Record */) 

現在,你可以方便地在這RDD執行轉換,例如,如果你想將其轉換爲以ID作爲密鑰的PairRDD,只需致電keyBy

val keyed: RDD[(Int, Record)] = parsed.keyBy(_.id) 

也就是說 - 即使你對「批處理」更感興趣而不是分析 - 使用DataFrame API可以更容易地實現這一點(也許性能更好,取決於你對RDD做什麼) - 它有良好的安全地閱讀CSV的設施(例如spark-csv)以及將數據視爲列而無需創建匹配每種記錄類型的案例類。