我已閱讀了許多Spark示例,但似乎無法找到如何使用CSV文件中的鍵列和多個值列創建RDD。在Spark中使用多列RDD?
我讀了一點關於Spark SQL的內容,並不認爲這是我想要的。我不想用這些數據進行交互式分析,更多的是批處理類型處理。
我對Java或Scala語法感興趣。
您能否指點我正確的方向?
我已閱讀了許多Spark示例,但似乎無法找到如何使用CSV文件中的鍵列和多個值列創建RDD。在Spark中使用多列RDD?
我讀了一點關於Spark SQL的內容,並不認爲這是我想要的。我不想用這些數據進行交互式分析,更多的是批處理類型處理。
我對Java或Scala語法感興趣。
您能否指點我正確的方向?
多列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)以及將數據視爲列而無需創建匹配每種記錄類型的案例類。
我不同意這是一個太寬泛的問題。我不問如何在Spark中使用CSV,我在問如何做一些更具體的事情。 – AfterWorkGuinness
您是否在尋找類似的東西:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html但在Spark? –