我有一个大约6GB的(String, String, String)数据集。在解析数据集之后,我使用(element => element._2)执行了(element => element._2),并获得了RDD[(String, Iterable[String, String, String])]。然后,foreach元素在groupby中,我正在执行toList,以便将其转换为DataFrame。
val dataFrame = groupbyElement._2.toList.toDF()但是,将数据保存为拼花文件格式需要花费大量的时间。我能用什么有效的方法吗?注:我有五个节点集群。每个节点有28 GB RAM和4核。我正在使用独立模式,并给予每个执行器16 GB内存。
发布于 2017-09-19 05:49:56
您可以尝试使用dataframe/dataset方法而不是用于RDD的方法。它可以是这样的:
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
val df = Seq(
("ABC", "123", "a"),
("ABC", "321", "b"),
("BCA", "123", "c")).toDF("Col1", "Col2", "Col3")
scala> df.show
+----+----+----+
|Col1|Col2|Col3|
+----+----+----+
| ABC| 123| a|
| ABC| 321| b|
| BCA| 123| c|
+----+----+----+
val df2 = df
.groupBy($"Col2")
.agg(
collect_list($"Col1") as "Col1_list"),
collect_list($"Col3") as "Col3_list"))
scala> df2.show
+----+----------+---------+
|Col2| Col1_list|Col3_list|
+----+----------+---------+
| 123|[ABC, BCA]| [a, c]|
| 321| [ABC]| [b]|
+----+----------+---------+此外,您可以使用这些方法直接获取数据,而不是将数据读入RDD中。
https://stackoverflow.com/questions/46292227
复制相似问题