我已经阅读了许多Spark示例,我似乎无法了解如何使用CSV文件中的键列和多个值列创建RDD。
我已经阅读了一些关于Spark SQL的内容,并且在这种情况下不要认为它是我想要的。我不是在寻找这种数据的交互式分析,而是更多的批处理类型处理。
我对Java或Scala语法感兴趣。
你能指出我正确的方向吗?
答案 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),并且可以将数据作为列处理,而无需创建与每种记录类型匹配的案例类。