【问题标题】:replace strings with ZipWithIndex/ZipWithUniqueID用 ZipWithIndex/ZipWithUniqueID 替换字符串
【发布时间】:2018-07-05 00:38:40
【问题描述】:

我正在尝试使用 ZipWithIndex 或 ZipWithUniqueID 将某个字符串替换为数字

假设我有这种格式

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

我想要这个结果

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

我所做的是提取键值对中的第一个元素 所以我做到了

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

我得到了这样的结果

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

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

希望你有我的问题

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    val rdd = spark.sparkContext.parallelize(Seq(
      ("name", "John"), ("age", "twinty"), ("name", "sam")
    ))
    

    扁平化数据:

    val flat = rdd.flatMap { case (x, y) => Seq(x, y) }
    

    获取唯一值:

    val unique = flat.distinct
    

    索引并收集为地图:

    val map = unique.zipWithIndex.collectAsMap
    

    返回并map:

    val indexed = rdd.map { case (x, y) => (map(x), map(y)) }
    

    享受结果

    indexed.toLocalIterator.foreach(println)
    (2,4)
    (3,0)
    (2,1)
    

    编辑

    使用重写的问题,将第一步替换为:

    val flat = rdd.flatMap { case (x, (y, z)) => Seq(x, y, z) }
    

    最后一步是:

    val indexed = rdd.map { case (x, (y, z)) => (map(x), (map(y), map(z))) }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2023-03-04
    • 2011-06-13
    • 2013-05-01
    相关资源
    最近更新 更多