我的数据集(String, String, String)
约为6GB。解析数据集后,我使用groupby
(element => element._2)
得到了RDD[(String, Iterable[String, String, String])]
并得到了foreach
。然后groupby
中的toList
元素我正在DataFrame
按顺序将其转换为val dataFrame = groupbyElement._2.toList.toDF()
。
function formatExercise($fmt, $var, $num)
{
echo sprintf($fmt, $var, $num);
}
formatExercise('There are %2$d %1$s in the tree!', 'monkeys', 5);
但是将数据保存为镶木地板文件格式需要花费大量时间。 我有什么有效的方法可以使用吗? 注:我有五个节点集群。每个节点有28 GB RAM和4个内核。我正在使用独立模式,并为每个执行程序提供16 GB RAM。
答案 0 :(得分:2)
您可以尝试使用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。