在Spark中使用多列RDD?

时间:2016-03-21 15:50:30

标签: apache-spark

我已经阅读了许多Spark示例,我似乎无法了解如何使用CSV文件中的键列和多个值列创建RDD。

我已经阅读了一些关于Spark SQL的内容,并且在这种情况下不要认为它是我想要的。我不是在寻找这种数据的交互式分析,而是更多的批处理类型处理。

我对Java或Scala语法感兴趣。

你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分: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)

那就是 - 即使你对“批量处理”而不是分析更感兴趣 - 这仍然可以更容易实现(也许表现更好,取决于你对这个RDD的处理方式)使用DataFrames API - 它具有安全读取CSV的良好工具(例如spark-csv),并且可以将数据作为列处理,而无需创建与每种记录类型匹配的案例类。