Hadoop Spark 1.4.1 - 对多个CSV文件进行排序,并将排序结果保存在1个输出文件中

时间:2016-03-11 19:18:58

标签: python scala csv hadoop apache-spark

我在HDFS中有3个文件,并希望使用最有效的方法在第1列然后在第2列上对它们进行排序,并使用Spark 1.4中的Scala(或Python)将排序结果存储回HDFS上的新文件。 1:
HDFS:///test/2016/file.csv
HDFS:///test/2015/file.csv
HDFS:///test/2014/file.csv

文件看起来像这样(没有标题):
HDFS:///test/2016/file.csv
127,56,ABC
125,56,ABC
121,56,ABC

HDFS:///test/2016/file.csv
126,66,ABC
122,56,ABC
123,46,ABC

HDFS:///test/2016/file.csv
122,66,ABC
128,56,ABC
123,16,ABC

排序输出要保存到HDFS:
HDFS:///test/output/file.csv
121,56,ABC
122,56,ABC
122,66,ABC
123,16,ABC
123,46,ABC
125,56,ABC
126,66,ABC
127,56,ABC
128,56,ABC

我对Spark很新,到目前为止我只知道如何加载文件:
val textFile = sc.textFile(" hdfs:///test/2016/file.csv")

试图在互联网上阅读如何排序但不清楚哪些库应该适用于这种情况(CSV文件)和此版本的Spark(1.4.1)以及如何使用它们。 请帮助,乔

2 个答案:

答案 0 :(得分:1)

我建议使用databricks csv库来读写csvs:https://github.com/databricks/spark-csv

由于我现在无法访问hdfs,此示例使用文件系统,但在与hdfs路径一起使用时也应该可以使用。

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.functions._  // needed for ordering the dataframe

object StackoverflowTest {

  def main(args: Array[String]) {
    // basic spark init
    val conf = new SparkConf().setAppName("Data Import from CSV")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)

    // first we load every file from the data directory that starts with 'file'
    val storeDf = sqlContext.read
      .format("com.databricks.spark.csv")
      .option("inferSchema", "true")
      .load("data/file*")

    // then we sort it and write to an output
    storeDf
      .orderBy("C0", "C1")  // default column names
      .repartition(1)   // in order to have 1 output file
      .write
      .format("com.databricks.spark.csv")
      .save("data/output")
  }

}

结果将作为csv写入data / output / part-00000。 希望这会有所帮助。

答案 1 :(得分:1)

val textFile = sc.textFile("hdfs:///test/*/*.csv")
                 .map( _.split(",",-1) match { case Array(col1, col2, col3) => (col1, col2, col3) })
                 .sortBy(_._1)
                 .map(_._1+","+_._2+","+_._3)
                 .saveAsTextFile("hdfs:///testoutput/output/file.csv")

您需要保存在其他文件夹中,否则您再次运行时会重复使用您生成的文件。