scala spark-saveAsTextFile-文件名

时间:2018-08-15 04:27:09

标签: scala apache-spark

问题陈述: 我正在尝试在Scala中编写一个Spark代码,它将从HDFS加载下面提到的两个磁贴(1. ID和名称的文件2. ID和薪水的文件)并将其合并,并生成(name.salary)值。并按薪水将数据保存在多个图块组中(意味着每个文件将使用薪水相同的员工姓名。文件名还必须包含薪水。

EmployeeName.csv 
E01,Lokesh 
E02,Bhupesh 
E03,Amit 
E04,Ratan 
E05,Dinesh 
E06,Pavan 
07,Tejas 
E08,Sheela 
E09,Kumar
E10,Venkat 

EmployeeSalary.csv 
E01,50000 
E02,50000 
E03,45000 
E04,45000 
E05,50000 
E06,45000 
E07,50000 
E08,10000 
E09,10000 
E10,10000 

我尝试了以下操作,但未运行。似乎另一个RDD中的RDD函数不起作用。我还能怎么解决呢?

val employeename = sc.textFile("/user/cloudera/EmployeeName").map(x => (x.split(",")(0),x.split(",")(1)))

val employeesalary = sc.textFile("/user/cloudera/EmployeeSalary").map(s => (s.split(",")(0),s.split(",")(1)))

val join = employeename.join(employeesalary).map({case(id,(name,salary)) => (salary,name)})

val group = join.groupByKey().map({case(key, groupvalues) => {
(key,groupvalues.toList)
}}).sortByKey()`enter code here`

val rdd1 = group.map{case (k,v) => k->sc.parallelize(v)}

rdd1.foreach{case (k,rdd) => rdd.saveAsTextFile("user/cloudera/"+k)}

2 个答案:

答案 0 :(得分:0)

获取每个文件(分区)仅包含一个雇员的信息相对容易,但是,Spark并不能真正让您控制输出文件名(如此处Change output filename prefix for DataFrame.write()

请注意,您可以将分区设置为路径的一部分(例如... / employee = Lokesh / salary = 50000 / part ... txt),但数据不会成为文件的一部分

答案 1 :(得分:0)

*我尝试了以下代码段。

使用Dataframe或Dataset代替RDD可以很好地执行操作。

我在下面的代码段中尝试过此操作,将结果保存到txt文件中。默认情况下,它将使用分区文件创建文件夹。可以在文件“ part-0000”中查看结果*

下面是代码段:

`

val rddInput1 = sc.textFile("Path To Input CSV1").map { x => (x.split(",")(0) -> x.split(",")(1)) }

val rddInput2 = sc.textFile("Path to Input CSV2").map { x => (x.split(",")(0) -> x.split(",")(1)) }

// Join based on EMP_ID
val joinData = rddInput1.join(rddInput2).map(x => x._1 -> x._2._2)

// Reduce By Key to aggregate, Option user can directly use joinData directly
// Actual code which wraps result into RDD then write into txt file

joinData.reduceByKey((k1, k2) => k1 + k2).sortByKey().map(x => x._1 + "__" + x._2).collect().foreach(x => {

val collectionTxt = Array[String](x);

sc.parallelize(collectionTxt)
.repartition(1)
.saveAsTextFile("<Output Dir>" + x)
})

`

我希望它可以帮助您完成尝试的工作...