我有一个要读取的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:
val result = Map("fruit" -> Map("aaa" -> "apple", "bbb" -> "orange"),
"animal" -> Map("ccc" -> "cat", "ddd" -> "dog"))
关于如何执行此操作的任何想法?
读入您的数据
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))