【问题标题】:Classify every instance of a RDD | Apache Spark Scala对 RDD 的每个实例进行分类 |阿帕奇火花斯卡拉
【发布时间】:2021-11-22 22:10:24
【问题描述】:

我开始使用 RDD,但我有一些疑问。就我而言,我有一个 RDD,我想对他的数据进行分类。我的 RDD 包含以下内容:

Array[(String, String)] = Array((data: BD=bd_users,BD_classified,contains_people, rbd: BD=bd_users,BD_classified,contains_people),
(data: BD=bd_users,BD_classified,contains_people,contains_users, user: id=8282bd, BD_USERS,bdd),
(data: BD=bd_experts,BD_exp,contains_exp,contains_adm, rbd: BD=bd_experts,BD_ea,contains_exp,contains_adm),
(data: BD=bd_test,BD_test,contains_acc,contains_tst, rbd: BD=bd_test,BD_test,contains_tst,contains_t))

如您所见,RDD 包含两个字符串,第一个以 data 开头,第二个以 rbd 开头。我想要做的是对该 RDD 的每个实例进行分类,如您在此处看到的:

If the instance contains bd_users & BD_classified -> users
bd_experts & BD_exp -> experts
BD_test -> tests

对于这个 RDD,输出会是这样的:

1. Users
2. Users
3. Experts
4. Test

为此,我想使用一个地图,为这个 RDD 中的每个实例调用一个函数,但我不知道如何定位:

val rdd_groups = rdd_1.map(x=>x(0).toString).map(x => getGroups(x))
def getGroups(input: String): (String) = {
//here i should use for example case to classify this strings?
}

如果您需要更多内容或示例,请告诉我。提前致谢!

【问题讨论】:

  • 你能修正一下类型吗?该数组中没有任何东西与字符串很相似,但您将其声明为Array[(String, String)],然后您将x(0) 映射到字符串,如果它实际上包含字符串,这将是多余的。这个条件是什么意思BD_classified -> users
  • 感谢您的回复。我必须检查第一个字符串是否包含其中一个选项。例如,如果数组的字符串 0 包含“BD_classified”,我必须返回“users”。我是 RDD 的新手,因此我不知道具体是如何工作的 :(
  • 当您 map 和 RDD 时,您传递给 map 的函数将应用于每个函数。您所要做的就是编写一个带有if 语句的函数,该语句检查您想要的子字符串并为每个分支返回正确的内容。有多种方法可以检查字符串是否包含子字符串。您可以使用 regex 或使用 Strings 上定义的函数之一
  • 谢谢@sinanspd,什么对 Apache Spark 更有效,当我找到解决方案或更好的用例时,使用 if else 和标志来摆脱困境?
  • 没关系。您极不可能有足够的数据来注意到差异。不要对代码进行微观管理

标签: scala apache-spark


【解决方案1】:

假设你已经定义了一个字符串的 RDD 和一个分类器:

  val rdd: RDD[String] =
    ???

  def classify(input: String): String =
    ???
  
  rdd.map(input => classify(input))

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 2014-12-17
    • 2016-04-27
    • 2014-03-15
    • 2020-11-05
    • 1970-01-01
    • 2020-10-21
    • 2018-07-09
    相关资源
    最近更新 更多