基于特定列对Spark Dataframe进行分区,并将每个分区的内容转储到csv上

时间:2016-11-19 10:21:25

标签: java apache-spark spark-dataframe

我正在使用spark 1.6.2 Java API在Dataframe DF1中加载一些看起来像这样的数据:

Key  Value
A    v1
A    v2
B    v3
A    v4

现在我需要根据“Key”列中的值子集对DF1进行分区,并将每个分区转储到csv文件(使用spark-csv)。

期望的输出:

A.csv

Key Value
A   v1
A   v2
A   v4

B.csv

Key Value
B   v3

目前我正在做的是构建一个HashMap(myList),其中包含我需要过滤的值的子集,然后迭代遍历每次迭代过滤不同的Key。使用以下代码我得到了我想要的但我想知道是否有更有效的方法来做到这一点:

DF1 = <some operations>.cache();

for (Object filterKey: myList.keySet()) {
  DF2 = DF1.filter((String)myList.get(filterKey));

  DF2.write().format.format("com.databricks.spark.csv")
            .option("header", "true")
      .save("/" + filterKey + ".csv");
}

1 个答案:

答案 0 :(得分:2)

你几乎就在那里,你只需要添加partitionBy,它将以你想要的方式对文件进行分区。

DF1
  .filter{case(key, value) => myList.contains(key))
  .write
  .partitionBy("key")
  .format("com.databricks.spark.csv")
  .option("header", "true")
  .save("/my/basepath/")

现在文件存储在&#34; / my / basepath / key = A /&#34;,&#34; / my / basepath / key = B /&#34;等等。< / p>