【发布时间】: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