我是 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")
非常感谢帮助!
答案 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
这就是全部。