如何将Iterable [String,String,String]转换为DataFrame?

时间:2017-09-19 05:07:36

标签: performance scala apache-spark apache-spark-sql spark-dataframe

我的数据集(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。

1 个答案:

答案 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。