【发布时间】:2017-01-07 18:52:16
【问题描述】:
我有一个 csv 数据文件存储在 HDFS 上的 sequenceFile 中,格式为 name, zip, country, fav_food1, fav_food2, fav_food3, fav_colour。可能有许多具有相同名称的条目,我需要找出他们最喜欢的食物是什么(即计算所有具有该名称的记录中的所有食物条目并返回最受欢迎的条目。我是 Scala 和 Spark 的新手,并且有浏览了多个教程并搜索了论坛,但一直不知道如何继续。到目前为止,我已经得到了将文本转换为字符串格式的序列文件,然后过滤掉了条目
这是文件中每一行的示例数据条目
Bob,123,USA,Pizza,Soda,,Blue
Bob,456,UK,Chocolate,Cheese,Soda,Green
Bob,12,USA,Chocolate,Pizza,Soda,Yellow
Mary,68,USA,Chips,Pasta,Chocolate,Blue
所以输出应该是元组 (Bob, Soda),因为 soda 在 Bob 的条目中出现的次数最多。
import org.apache.hadoop.io._
var lines = sc.sequenceFile("path",classOf[LongWritable],classOf[Text]).values.map(x => x.toString())
// converted to string since I could not get filter to run on Text and removing the longwritable
var filtered = lines.filter(_.split(",")(0) == "Bob");
// removed entries with all other users
var f_tuples = filtered.map(line => lines.split(",");
// split all the values
var f_simple = filtered.map(line => (line(0), (line(3), line(4), line(5))
// removed unnecessary fields
我现在遇到的这个问题是,我认为我有这个 [<name,[f,f,f]>] 结构,但我真的不知道如何将其展平并获得最受欢迎的食物。我需要合并所有条目,所以我有一个带有 a 的条目,然后获取值中最常见的元素。任何帮助,将不胜感激。谢谢
我试过这个让它变平,但似乎我尝试得越多,数据结构就越复杂。
var f_trial = fpairs.groupBy(_._1).mapValues(_.map(_._2))
// the resulting structure was of type org.apache.spark.rdd.RDD[(String, Interable[(String, String, String)]
这是 f_trial 之后记录的 println 的样子
("Bob", List((Pizza, Soda,), (Chocolate, Cheese, Soda), (Chocolate, Pizza, Soda)))
括号分解
("Bob",
List(
(Pizza, Soda, <missing value>),
(Chocolate, Cheese, Soda),
(Chocolate, Pizza, Soda)
) // ends List paren
) // ends first paren
【问题讨论】:
-
您是否需要为每个人提供一种最受欢迎的食物,或者您是否需要每个名字都获得最喜欢的食物?您能否提供一个示例 od 您的 f_simple 数据以及您想要得到什么?
-
@Niemand 现在我只需要该名称的名称和最受欢迎的食物(将来我可能需要获得最受欢迎的前 3 名或其他什么,但我只需要一个基础即可开始on),我也在想同样的事情,我应该提供数据集并且刚刚提供,谢谢回复。
-
Bob 的第一个条目只有两种最喜欢的食物。记录的列数是否都相同?
-
@Paul,感谢回复,每个条目最多可以有3种喜欢的食物,我可以少但绝对不能多。即使只有 1 或 2 个条目(只是在其中编辑),也会包含尾随逗号。
-
没有时间得到正确的答案,但我认为你需要扁平化到
(name, food)(或者可能是((name, food), 1))然后reducebyKey到((name,food),total),Map到(name, (food, total)),reduceByKey再次(仅在减少步骤中保留最大总数)。这为您提供(name, (food, total))每个人最受欢迎的食物
标签: scala hadoop apache-spark