将数据转换为 spark scala 中的类对象列表
Posted
技术标签:
【中文标题】将数据转换为 spark scala 中的类对象列表【英文标题】:Transformation of data into list of objects of class in spark scala 【发布时间】:2016-12-24 03:31:41 【问题描述】:我正在尝试编写一个 spark 转换代码来将以下数据转换为以下类的对象列表,我对 scala 和 spark 完全陌生,并尝试拆分数据并将它们放入案例类中,但我无法追加他们回来了。请求您的帮助。
数据:
FirstName,LastName,Country,match,Goals
Cristiano,Ronaldo,Portugal,Match1,1
Cristiano,Ronaldo,Portugal,Match2,1
Cristiano,Ronaldo,Portugal,Match3,0
Cristiano,Ronaldo,Portugal,Match4,2
Lionel,Messi,Argentina,Match1,1
Lionel,Messi,Argentina,Match2,2
Lionel,Messi,Argentina,Match3,1
Lionel,Messi,Argentina,Match4,2
期望的输出:
PLayerStats String FirstName,
String LastName,
String Country,
Map <String,Int> matchandscore
【问题讨论】:
【参考方案1】:假设您已经将数据加载到名为 data
的 RDD[String]
中:
case class PlayerStats(FirstName: String, LastName: String, Country: String, matchandscore: Map[String, Int])
val result: RDD[PlayerStats] = data
.filter(!_.startsWith("FirstName")) // remove header
.map(_.split(",")).map // map into case classes
case Array(fn, ln, cntry, mn, g) => PlayerStats(fn, ln, cntry, Map(mn -> g.toInt))
.keyBy(p => (p.FirstName, p.LastName)) // key by player
.reduceByKey((p1, p2) => p1.copy(matchandscore = p1.matchandscore ++ p2.matchandscore))
.map(_._2) // remove key
【讨论】:
@Bhushan 很高兴它有帮助 - 您可以接受/投票,让未来的读者知道这很有用【参考方案2】:首先将行转换为键值对说(Cristiano, rest of data)
然后应用groupByKey
或reduceByKey
也可以工作然后尝试通过放置值将groupByKey或reduceByKey应用到你的类后转换键值对数据。借助著名的字数统计程序。
http://spark.apache.org/examples.html
【讨论】:
【参考方案3】:您可以尝试以下方法:
val file = sc.textFile("myfile.csv")
val df = file.map(line => line.split(",")). // split line by comma
filter(lineSplit => lineSplit(0) != "FirstName"). // filter out first row
map(lineSplit => // transform lines
(lineSplit(0), lineSplit(1), lineSplit(2), Map((lineSplit(3), lineSplit(4).toInt)))).
toDF("FirstName", "LastName", "Country", "MatchAndScore")
df.schema
// res34: org.apache.spark.sql.types.StructType = StructType(StructField(FirstName,StringType,true), StructField(LastName,StringType,true), StructField(Country,StringType,true), StructField(MatchAndScore,MapType(StringType,IntegerType,false),true))
df.show
+---------+--------+---------+----------------+
|FirstName|LastName| Country| MatchAndScore|
+---------+--------+---------+----------------+
|Cristiano| Ronaldo| Portugal|Map(Match1 -> 1)|
|Cristiano| Ronaldo| Portugal|Map(Match2 -> 1)|
|Cristiano| Ronaldo| Portugal|Map(Match3 -> 0)|
|Cristiano| Ronaldo| Portugal|Map(Match4 -> 2)|
| Lionel| Messi|Argentina|Map(Match1 -> 1)|
| Lionel| Messi|Argentina|Map(Match2 -> 2)|
| Lionel| Messi|Argentina|Map(Match3 -> 1)|
| Lionel| Messi|Argentina|Map(Match4 -> 2)|
+---------+--------+---------+----------------+
【讨论】:
以上是关于将数据转换为 spark scala 中的类对象列表的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spark Dataframe scala 将多个不同的列转换为 Map 列
使用 Scala 将多列转换为 Spark Dataframe 上的一列地图
SPARK 数据框错误:在使用 UDF 拆分列中的字符串时无法转换为 scala.Function2