温馨提示:本文翻译自stackoverflow.com,查看原文请点击:apache spark - How to read from a csv file to create a scala Map object?
apache-spark scala rdd

apache spark - 如何从csv文件读取以创建Scala Map对象?

发布于 2020-03-27 11:47:12

我有一个要读取的csv的路径。该csv包括三列:“主题,键,值”我正在使用spark将此文件读取为csv文件。该文件如下所示(lookupFile.csv):

Topic,Key,Value
fruit,aaa,apple
fruit,bbb,orange
animal,ccc,cat
animal,ddd,dog

//I'm reading the file as follows
val lookup = SparkSession.read.option("delimeter", ",").option("header", "true").csv(lookupFile)

我想拿我刚刚读的东西,并返回一个具有以下属性的 map:

  • 该 map使用主题作为关键
  • 该映射的值是“键”和“值”列的映射

我希望得到一张如下图的 map:

val result = Map("fruit" -> Map("aaa" -> "apple", "bbb" -> "orange"),
                 "animal" -> Map("ccc" -> "cat", "ddd" -> "dog"))

关于如何执行此操作的任何想法?

查看更多

查看更多

提问者
jjaguirre394
被浏览
169
mikeL 2019-07-03 23:21

读入您的数据

val df1= spark.read.format("csv").option("inferSchema", "true").option("header", "true").load(path)

首先将“键,值”放入array和groupBy主题中,以将目标分为键部分和值部分。

val df2= df.groupBy("Topic").agg(collect_list(array($"Key",$"Value")).as("arr"))

现在转换为数据集

val ds= df2.as[(String,Seq[Seq[String]])]

在字段上应用逻辑以获取 map并收集

val ds1 =ds.map(x=> (x._1,x._2.map(y=> (y(0),y(1))).toMap)).collect

现在,您已将“主题”作为键,将“键,值”作为“值”来设置数据,因此现在应用“ map”获取结果

ds1.toMap

Map(animal -> Map(ccc -> cat, ddd -> dog), fruit -> Map(aaa -> apple, bbb -> orange))