`X1:Y1 | X2:Y2..`将Scala中的文本文件转换为`X1 Y1..`

`X1:Y1 | X2:Y2..`将Scala中的文本文件转换为`X1 Y1..`,scala,apache-spark,Scala,Apache Spark,我有一个文本文件包含以下数据 X1:Y1|X2:Y2|X3:Y3|X4:Y4|X5:Y5 我想实现这个输出 X1 Y1 X2 Y2 X3 Y3 X4 Y4 X5 Y5 现在,我一直在努力实现这一目标,但无法实现 我尝试了以下代码: scala> val input = sc.textFile("/home/bhaskar/Desktop/log.txt") input: org.apache.spark.rdd.RDD[String] = /home/bhaskar/Desktop/l

我有一个文本文件包含以下数据

X1:Y1|X2:Y2|X3:Y3|X4:Y4|X5:Y5
我想实现这个输出

X1 Y1
X2 Y2
X3 Y3
X4 Y4
X5 Y5
现在,我一直在努力实现这一目标,但无法实现

我尝试了以下代码:

scala> val input = sc.textFile("/home/bhaskar/Desktop/log.txt")
input: org.apache.spark.rdd.RDD[String] = /home/bhaskar/Desktop/log.txt MapPartitionsRDD[1] at textFile at <console>:24

scala> val rdd1 = input.flatMap(line => line.split('|'))
rdd1: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[23] at flatMap at <console>:26
scala>val input=sc.textFile(“/home/bhaskar/Desktop/log.txt”)
输入:org.apache.spark.rdd.rdd[String]=/home/bhaskar/Desktop/log.txt MapPartitionsRDD[1]位于文本文件的24
scala>val rdd1=input.flatMap(line=>line.split(“|”))
rdd1:org.apache.spark.rdd.rdd[String]=MapPartitionsRDD[23]位于flatMap at:26
获得以下不同的输出:

scala> for(x <- rdd1){println(x)}
X1:Y1
X2:Y2
X3:Y3
X4:Y4
X5:Y5

scala> for(x <- rdd1){println(x.split(":"))}
[Ljava.lang.String;@3ce3bfde
[Ljava.lang.String;@7752bb7c
[Ljava.lang.String;@3af05705
[Ljava.lang.String;@2296f59c
[Ljava.lang.String;@3aaa35f

scala> for(x <- rdd1){println(x.split(":").toString())}
[Ljava.lang.String;@36154dc9
[Ljava.lang.String;@586b85e5
[Ljava.lang.String;@1436d0d6
[Ljava.lang.String;@21295bb6
[Ljava.lang.String;@3dce215f
scala>for(x代表)(x代表(x

您正试图打印一个
字符串的列表,而应该事先将其元素连接起来。

最简单的方法是替换字符:

input.replace(":", " ").replace("|", "\n")
但是,在我看来,最好将输入转换为适当的数据结构(在本例中,我选择了
Seq[(String,String)]
但当然是YMMV):

这样我们就可以更自由地使用它

鉴于这种结构,现在打印您最初想要的内容非常容易:

for ((a, b) <- parsed) {
  println(s"$a $b")
}
for((a,b)您的代码
x.split(“|”)
正在生成一个Java数组,该数组被打印为
[Ljava.lang.String;@36154dc9

关于打印Java数组有很多Google左右的答案,但在Scala中你可以这样做

scala> for(x <- rdd1) { println(x.split(":").mkString(" ")) }

scala>for(x您只需将所有冒号
:“
替换为空格
”,将所有管道
“|”
替换为新行
“\n”
。请尝试以下代码

val str = "X1:Y1|X2:Y2|X3:Y3|X4:Y4|X5:Y5"

val foramttedStr = str.replaceAll(":"," ").replaceAll("\\|","\n")

print(foramttedStr)

//output
// X1 Y1
// X2 Y2
// X3 Y3
// X4 Y4
// X5 Y5
Spark
程序中使用类似的东西,您可以使用以下代码

val rdd1: RDD[String] = input.map(line => line.replaceAll(":"," ").replaceAll("\\|","\n"))

rdd1.foreach(println(_))

它将产生与上面相同的输出。

非常感谢,但很抱歉!您查询的输出显示为
x1y1 | x2y2 | x3y3 | x4y4 | x5y5rdd1:Unit=()
Vertically@BhaskarDas它对我来说非常好,请确保按
“|”分割
而不是“|”-如果要使用字符串,则必须使用反斜杠转义管道符号,因为它被视为正则表达式-“\\\”
val str = "X1:Y1|X2:Y2|X3:Y3|X4:Y4|X5:Y5"

val foramttedStr = str.replaceAll(":"," ").replaceAll("\\|","\n")

print(foramttedStr)

//output
// X1 Y1
// X2 Y2
// X3 Y3
// X4 Y4
// X5 Y5
val rdd1: RDD[String] = input.map(line => line.replaceAll(":"," ").replaceAll("\\|","\n"))

rdd1.foreach(println(_))