我的文字数据如下
no1 1|3|4 no2 4|5|6
我想使用spark RDD和scala语言转换上面的数据。
no1 1 no1 3 no1 4 no2 4 no2 5 no2 6
我是Spark和Scala的新手。我无法找到任何这样做的例子。
答案 0 :(得分:4)
我建议您将文件作为数据框读入,其API将在未来的spark版本中比RDD API更加重视。使用数据框,使用split
和explode
函数,您要求的任务相当简单:
val df = Seq(("no1", "1|3|4"), ("no2", "4|5|6")).toDF("A", "B")
// df: org.apache.spark.sql.DataFrame = [A: string, B: string]
df.show
+---+-----+
| A| B|
+---+-----+
|no1|1|3|4|
|no2|4|5|6|
+---+-----+
df.withColumn("B", explode(split($"B", "\\|"))).show
+---+---+
| A| B|
+---+---+
|no1| 1|
|no1| 3|
|no1| 4|
|no2| 4|
|no2| 5|
|no2| 6|
+---+---+
答案 1 :(得分:0)
我们可以阅读文本文件,只需将rdd转换用于您的解决方案
val rrd=spark.sparkContext.textFile("file_path").map(x=>x.split("\t")).map(x=>(x.head,x.last))
val trdd=rdd.map{case(k,v)=> v.split("\\|").map((k,_))}
trdd.collect.foreach(x=>x.foreach(x=>println(x._1+"\t"+x._2)))
o/p looks like
no1 1
no1 3
no1 4
no2 4
no2 5
no2 6