[英]Split field and create multi rows from one row Spark-Scala
我是新来的,需要这个问题的帮助。
我有这样的csv文件:
ANI,2974483123 29744423747 293744450542,Twitter,@ani
我需要拆分第二列“ 2974483123 29744423747 293744450542”并创建3行,如下所示:
ANI,2974483123,Twitter,@ani
ANI,29744423747,Twitter,@ani
ANI,293744450542,Twitter,@ani
有人能帮我吗? 请!
您正在寻找flatMap
:
val input: RDD[String] = sc.parallelize(Seq("ANI,2974483123 29744423747 293744450542,Twitter,@ani"))
val csv: RDD[Array[String]] = input.map(_.split(','))
val result = csv.flatMap { case Array(s1, s2, s3, s4) => s2.split(" ").map(part => (s1, part, s3, s4)) }
这是一个略有不同的解决方案,它利用了Spark可用的内置SQL UDF。 理想情况下,应使用这些参数代替自定义函数,以利用查询优化器提供的性能改进( https://blog.cloudera.com/blog/2017/02/working-with-udfs-in-apache-spark/ ) 。
import org.apache.spark.sql.functions.{split, explode}
val filename = "/path/to/file.csv"
val columns = Seq("col1","col2","col3","col4")
val df = spark.read.csv(filename).toDF(columns: _*)
// import "split" instead of writing your own split UDF
df.withColumn("col2", split($"col2", " ")).
// import "explode instead of map then flatMap
select($"col1", explode($"col2"), $"col3", $"col4").take(10)
与Tzach的答案非常相似,但在python2中,请注意多空间分隔符。
import re
rdd = sc.textFile("datasets/test.csv").map(lambda x: x.split(","))
print(rdd.take(1))
print(rdd.map(lambda (a, b, c, d): [(a, number, c, d) for number in re.split(" +", b)])
.flatMap(lambda x: x)
.take(10))
#[[u'ANI', u'2974481249 2974444747 2974440542', u'Twitter', u'maximotussie']]
#[(u'ANI', u'2974481249', u'Twitter', u'maximotussie'),
# (u'ANI', u'2974444747', u'Twitter', u'maximotussie'),
# (u'ANI', u'2974440542', u'Twitter', u'maximotussie')]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.