繁体   English   中英

Scala / Spark:如何将值列表转换为单独的行?

[英]Scala/Spark : How to convert List of values into separate rows?

我是Scala / Spark的新手。 我想将List的值转换为仅使用RDD的单独行(无数据帧)。 感谢任何人可以帮助我。

输入:

List( ("A",List(10643, 10692)), ("B",List(10308)),("C",List(1000,2000)) )

预期产出:

A 10643
A 10692
B 10308
C 1000
C 2000

我可以单独做,但不能一起做。

这是我试过的

val Input = sc.makeRDD(List( ("A",List(10643, 10692)), ("B",List(10308)),("C",List(1000,2000))  ))

Input.map(value=>value._1).collect().foreach(println)<
A
B
C

Input.map(value=>value._2).flatMap(x=>x).collect().foreach(println)<br>
10643
10692
10308
1000
2000

使用函数explode为给定数组或映射列中的每个元素创建一个新行。

import org.apache.spark.sql.functions._

val data = List( ("A",List(10643, 10692)), ("B",List(10308)),("C",List(1000,2000)) )
val rdd = sc.parallelize(data) 
val df = rdd.toDF("name", "list")

val exploded = df.withColumn("value", explode($"list")).drop("list")
exploded.show

如果真的更喜欢使用RDD

val flatted = rdd.flatMap(r => r._2.map((r._1, _)))

这是一个与Spark无关的解决方案:

val list = List(("A", List(10643, 10692)), ("B", List(10308)), ("C", List(1000, 2000)))

val result = list.flatMap { 
  case (key, value) => value.map(v => (key, v))
}

result.foreach(println)

// (A,10643)
// (A,10692)
// (B,10308)
// (C,1000)
// (C,2000)

两种解决方案(第二种是更具可扩展性):

处理驱动程序然后转换为RDD

val in = List( ("A",List(10643, 10692)), ("B",List(10308)),("C",List(1000,2000)) )

val out = sc.parallelize(in.flatMap{case (k, l) => l.map(v => (k,v))})

out.take(10).foreach(println)

转换为RDD然后处理执行程序

val in = List( ("A",List(10643, 10692)), ("B",List(10308)),("C",List(1000,2000)) )

val inRDD = sc.parallelize(in)

val out = inRDD.flatMap{case (k, l) => l.map(v => (k,v))}

使用PairRDDFunctions

import scala.collection.mutable._
val df = List( ("A",List(10643, 10692)), ("B",List(10308)),("C",List(1000,2000)) ).toDF("name","list")
val rdd1 = df.rdd.map( x=>  (x(0), x(1)))
val pair = new PairRDDFunctions(rdd1)
pair.flatMapValues(_.asInstanceOf[mutable.WrappedArray[Int]]).foreach(println)

结果:

(A,10643)
(B,10308)
(A,10692)
(C,1000)
(C,2000)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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