Apache spark:将csv文件映射到key:value格式

时间:2015-03-18 14:48:39

标签: scala apache-spark

我是 Apache Spark和Scala 的新手,我在将.csv文件映射到键值(如JSON)结构时遇到了问题。

我想要完成的是获取.csv文件:

user, timestamp, event
ec79fcac8c76ebe505b76090f03350a2,2015-03-06 13:52:56,USER_PURCHASED
ad0e431a69cb3b445ddad7bb97f55665,2015-03-06 13:52:57,USER_SHARED
83b2d8a2c549fbab0713765532b63b54,2015-03-06 13:52:57,USER_SUBSCRIBED
ec79fcac8c76ebe505b76090f03350a2,2015-03-06 13:53:01,USER_ADDED_TO_PLAYLIST
...

进入如下结构:

ec79fcac8c76ebe505b76090f03350a2: [(2015-03-06 13:52:56,USER_PURCHASED), (2015-03-06 13:53:01,USER_ADDED_TO_PLAYLIST)]
ad0e431a69cb3b445ddad7bb97f55665: [(2015-03-06 13:52:57,USER_SHARED)]
83b2d8a2c549fbab0713765532b63b54: [(2015-03-06 13:52:57,USER_SUBSCRIBED)]
...

如果通过以下方式读取文件,该怎么做?

val csv = sc.textFile("file.csv")

非常感谢帮助!

2 个答案:

答案 0 :(得分:1)

类似的东西:

     case class MyClass(user: String, date: String, event: String)
     def csvToMyClass(line: String) =
     {
        val split = line.split(',')
        // This is a good place to do validations 
        // And convert strings to numbers, enums, UUIDs, etc.
        MyClass(split(0), split(1), split(2))
     }

     val csv = sc.textFile("file.csv")
        .map(scvToMyClass)

当然,做更多的工作来在你的课上拥有更具体的数据类型,而不仅仅是字符串......

这是用于将CSV文件读入结构(似乎是您的主要问题)。如果您需要合并单个用户的所有数据,则可以映射到键/值元组(String -> (String, String)),然后使用.aggregateByKey()加入用户的所有元组。然后,您的聚合函数可以返回您想要的任何结构。

答案 1 :(得分:0)

丹尼尔是对的。

稍后你必须这样做:

csv.keyBy(_.user).groupByKey

这就是全部。