我有一个大的CSV(> 500 MB),我将其带入一个火花RDD,我想将它存储到一个大的Map [String,Array [Long]]。 CSV有多列,但我暂时只需要两列。第一列和第二列,形式为:
A 12312 [some_value] ....
B 123123[some_value] ....
A 1222 [some_value] ....
C 1231 [some_value] ....
我希望我的地图基本上按字符串分组并存储一个long数组 所以,对于上述情况,我的地图将是: {" A":[12312,1222]," B":123123," C":1231}
但由于这张地图很大,我不能直接这样做。 TSCA
我在sql.dataframe中使用CSV
到目前为止我的代码(看起来不正确):
def getMap(df: sql.DataFrame, sc: SparkContext): RDD[Map[String, Array[Long]]] = {
var records = sc.emptyRDD[Map[String, Array[Long]]]
val rows: RDD[Row] = df.rdd
rows.foreachPartition( iter => {
iter.foreach(x =>
if(records.contains(x.get(0).toString)){
val arr = temp_map.getOrElse()
records = records + (x.get(0).toString -> (temp_map.getOrElse(x.get(0).toString) :+ x.get(1).toString.toLong))
}
else{
val arr = new Array[Long](1)
arr(0) = x.get(1).toString.toLong
records = records + (x.get(0).toString -> arr)
}
)
})
}
提前致谢!
答案 0 :(得分:1)
如果我理解你的问题,那么
你可以groupBy
第一列和collect_list
第二列column
import org.apache.spark.sql.functions._
val newDF = df.groupBy("column1").agg(collect_list("column2"))
newDF.show(faslse)
val rdd = newDF.rdd.map(r => (r.getString(0), r.getAs[List[Long]](1)))
这将为您提供RDD[(String, List[Long])]
字符串将是唯一的