【发布时间】:2019-06-25 14:58:06
【问题描述】:
我是 scala spark 的新手,我有一个 CSV 文件,如下所示。
R001, A, 10, C, 30, D, 50, X, 90
R002, E, 40, F, 70, G, 80, H, 90, J, 25
R003, L, 30, M, 54, N, 67, O, 25, P, 85, Q, 100
如何将其转换为以行的第一个值为 Key 并跳过数值的 Pair RDD?
R001, A
R001, C
R001, D
R001, X
R002, E
R002, F
R002, G
R002, H
R002, J
R003, L
R003, M
R003, N
R003, O
R003, P
R003, Q
我试过了,看起来还不错,但我认为有更好的方法来做到这一点。
def isNumeric(str:String): Boolean = str.matches("[-+]?\\d+(\\.\\d+)?")
def process(field: Array[String]): Array[String] = {
val results = new Array[String](field.length)
for (i <- 1 to field.length-1) {
if(!isNumeric(field(i).trim) && field(0)!=null && field(i)!=null)
results(i)= field(0)+":"+field(i)
}
results
};
def skipNulls(input : String) : String = {
if(input!=null && input.trim!="" && input.contains(":")) {
var res = input.split(":")
res(0)+","+res(1)
} else {
"null"
}
};
val a= raw_csv.map(_.split(",")).flatMap(k => process(k))
val b= a.map(k => skipNulls(k))
val c = b.filter( x => x.contains("null")==false)
val d= c.toDF()
d.show
display(d)
【问题讨论】:
-
更新了问题并添加了我尝试过的内容
标签: scala apache-spark rdd