使用ZipWithIndex / ZipWithUniqueID

时间:2018-01-29 18:32:54

标签: scala apache-spark

之前我问过这个问题,但目前还不清楚所以我添加了更多解释,以便更清楚并获得帮助。 replace strings with ZipWithIndex/ZipWithUniqueID

我正在尝试使用ZipWithIndex或ZipWithUniqueID

将字符串映射到数字

假设我有这种格式

("u1",("name", "John Sam"))
("u2",("age", "twinty Four"))
("u3",("name", "sam Blake"))

我想要这个结果

(0,(3,4))
(1,(5,6))
(2,(3,8))

我尝试将zipWithIndex直接用于三元组,但我将每个字母映射到一个数字,我想要映射整个字符串而不分割它。 并尝试提取键值对中的第一个元素 所以我做了

val first = file.map(line=> line._1).distinct()
then apply ZipWithIndex
val z1= first.ZipWithIndex()

我得到了这样的结果

("u1",0)
("u2",1)
("u3",2)

现在我需要获取ids /数字并在原始文件中进行更改。我需要在hashTable中保留所有不同的id /数字,以便以后能够查找它们。 有没有办法做到这一点?有什么建议吗?

我希望你有我的问题

1 个答案:

答案 0 :(得分:0)

你的意思是这样的吗?

val file = List(("u1",("name", "John Sam")),
  ("u2",("age", "twinty Four")),
  ("u3",("name", "sam Blake")))

val first = file.map(line=> line._1) ++
  file.flatMap(line=> List(line._2._1, line._2._2)).distinct


val z1: Map[String,Int] = Map[String,Int](first.zipWithIndex:_*)

file.map{ l =>
  (z1(l._1),
    (z1(l._2._1), z1(l._2._2)))
}