【问题标题】:MapReduce functionsMapReduce 函数
【发布时间】:2019-06-25 18:09:07
【问题描述】:

我正在使用 scala 在 eclipse IDE 上开发一个 spark 项目

我想要一些关于这个 MapReduce 问题的帮助

地图功能:

  1. 删除“运动”和“交易所”列
  2. 删除任何具有“NULL”的行
  3. 添加新的列持续时间周期。这必须根据学生的周期取值:执照(3 年)、硕士(3 年)、Ingeniorat(5 年)和博士学位(3 年)

减速机:

  1. 根据年级、周期和专业将所有学生加起来。

我的输入是

matricule,dateins,cycle,specialite,bourse,sport

0000000001,1999-11-22,Master,IC,Non,Non

0000000002,2014-02-01,Null,IC,Null,Oui

0000000003,2006-09-07,Null,Null,Oui,Oui

0000000004,2008-12-11,大师,IC,Oui,Oui

0000000005,2006-06-07,Master,SI,Non,Oui

0000000006,1996-11-16,Ingeniorat,SI,Null,Null

等等。

这是我开始的代码。我已经删除了列'sport''bourse'并提取了年份

val sc = new SparkContext(conf)
   val x = sc.textFile("/home/amel/one")
  val re = x.map(_.split(",")).foreach(r => println(r(1).dropRight(6), r(2),r(3)))

这是我得到的结果

(2000,许可证,Isil)

(2001,硕士,SSI)

我想要的结果是:

年周期持续时间专业 Nbr-学生

(2000,执照,3年,Isil,400)

(2001,硕士,3年,SSI,120)

// 我希望 'Nbr-students' 列是根据他们的周期和专业每年的学生人数。

【问题讨论】:

  • 我不认为这是一个与 MapReduce 相关的问题(您以前可能使用过 MR,但这个问题本身不一定专门针对 MR),所以我已经从您的问题,因为我们没有使用 MapReduce 来解决这个问题,并且描述中没有包含 MapReduce 代码。
  • 我使用了 Map 函数来拆分我的文本文件。你是什​​么意思这不需要mapreduce功能?我告诉你我创建了一个类似的项目。我只是无法清除任何包含 NULLS 的行
  • 您已使用 Apache-Spark 中的 map 函数来拆分您的文本文件。您在这里没有使用 MapReduce 代码,因为 MapReduce 是一个使用 Mappers 和 Reducers 构建的框架。您正在将数据从一种形式映射到另一种形式。
  • 哦,现在我明白了。那么有没有办法解决这个问题?
  • 是的,我目前正在研究解决方案 :)

标签: scala apache-spark mapreduce


【解决方案1】:

我假设您只想要年份 - 如果您不想要年份,请将 cols(1).split("-")(0) 更改为 cols(1)

首先我使用您的示例数据伪造了一些数据:

val x = sc.parallelize(Array(
  "001,2000-12-22,License,Isil,no,yes",
  "002,2001-11-30,Master,SSI,no,no",
  "003,2001-11-30,Master,SSI,no,no",
  "004,2001-11-30,Master,SSI,no,no",
  "005,2000-12-22,License,Isil,no,yes"
))

接下来我做了一些 RDD 转换。首先,我删除并创建必要的列,然后将计数添加到每一行。最后,我通过 reduceByKey 计算所有具有相同信息的行:

val re = x.map(row => {
  val cols = row.split(",")
  val cycle = cols(2)
  val years = cycle match {
    case "License" => "3 years"
    case "Master" => "3 years"
    case "Ingeniorat" => "5 years"
    case "Doctorate" => "3 years"
    case _ => "other"
  }
  (cols(1).split("-")(0) + "," + years + "," + cycle + "," + cols(3), 1)
}).reduceByKey(_ + _)
re.collect.foreach(println)
(2000,3 years,License,Isil,2)
(2001,3 years,Master,SSI,3)

【讨论】:

  • 是的,我的数据用逗号分隔。我只是想让我的数据对你来说更具可读性
  • 相信你忘记了reduceByKey函数
  • 包括 :) @Amelha
  • 那是因为你的数据格式。对于少于三列数据的行,我需要查看实际数据的复制/粘贴示例(不更改空格的逗号)。
  • 请检查。我已经编辑了我的问题并准确地包含了输入
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多