我在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)以及如何使用它们。 请帮助,乔
答案 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")
您需要保存在其他文件夹中,否则您再次运行时会重复使用您生成的文件。