Spark RDD映射问题

时间:2017-01-24 03:00:45

标签: scala apache-spark

我的文字数据如下

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的新手。我无法找到任何这样做的例子。

2 个答案:

答案 0 :(得分:4)

我建议您将文件作为数据框读入,其API将在未来的spark版本中比RDD API更加重视。使用数据框,使用splitexplode函数,您要求的任务相当简单:

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
相关问题