繁体   English   中英

拆分字段并从一行Spark-Scala创建多行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM