将键值分解为键值对scala

时间:2018-06-03 18:28:13

标签: scala apache-spark

我有3行作为输入,其中键和值被分组。 现在想要将值取消组合到每个键值对。

示例输入

LKG, LK1, 10, LK2, 20, LK3, 30    
UKG, UK1, 20, UK2, 10, UK5 

SRKG, SRK4, 30, SRK10, 5

预期输出

LKG,LK1

LKG,LK2

LKG,LK3

UKG,UK1

UKG,UK2

UKG,UK5

SRKG,SRK4

SRKG,SRK10

注意:整数值(如10,20,30)在输出

中不应包含任何键值对

我已经尝试过这个程序,但是无法从给定的输入中排除数字,而密钥又作为另一个密钥对出现。

    val data = """
    LKG, LK1, 10, LK2, 20, LK3, 30
    UKG, UK1, 20, UK2, 10, UK5
    SRKG, SRK4, 30, SRK10, 5""".trim

    val records = sc.parallelize(data.split('\n'))

    val pairs = records.map(x => (x.split(',')(0), x))

val groupedRDD = pairs.flatMap{case(k, v)=> v.split(",").map(x => (k, x))}
groupedRDD.collect().foreach(println)

请建议可以替代解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:0)

以下内容应该得到您想要的输出

val data = """
LKG, LK1, 10, LK2, 20, LK3, 30
UKG, UK1, 20, UK2, 10, UK5
SRKG, SRK4, 30, SRK10, 5""".trim

data.split("\n").map(_.split(",").filterNot(_.trim.forall(_.isDigit))).flatMap(x => x.tail.map(y => (x(0).trim, y.trim)))

致电.foreach(println)应该会给你

(LKG,LK1)
(LKG,LK2)
(LKG,LK3)
(UKG,UK1)
(UKG,UK2)
(UKG,UK5)
(SRKG,SRK4)
(SRKG,SRK10)