scala spark-saveAsTextFile-文件名

scala spark-saveAsTextFile-文件名,scala,apache-spark,Scala,Apache Spark,问题陈述: 我正在尝试用Scala编写一个Spark代码,它将从HDFS加载下面提到的两个tile(1.file with id and name 2.file with id and salary),并将它们连接起来,生成(name.salary)值。并按薪资将数据保存在多个平铺组中(意味着每个文件都有相同薪资的员工姓名。文件名还必须包括薪资 EmployeeName.csv E01,Lokesh E02,Bhupesh E03,Amit E04,Ratan E05,Dinesh

问题陈述: 我正在尝试用Scala编写一个Spark代码,它将从HDFS加载下面提到的两个tile(1.file with id and name 2.file with id and salary),并将它们连接起来,生成(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)}

让每个文件(分区)只包含一名员工的信息相对容易,但是Spark并不真正让您控制输出文件名(如本文所述)


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

*我尝试了以下代码片段

代替RDD,使用Dataframe或Dataset来执行操作将非常好

我尝试了下面这个代码段,它将结果保存在txt文件中。默认情况下,它将创建带有分区文件的文件夹。结果可以在文件“part-0000”中查看*

下面是代码片段:

`

val rddInput1=sc.textFile(“输入CSV1的路径”).map{x=>(x.split(“,”)(0)->x.split(“,”)(1)))
val rddInput2=sc.textFile(“输入CSV2的路径”).map{x=>(x.split(“,”)(0)->x.split(“,”)(1))}
//基于EMP_ID加入
val joinData=rddInput1.join(rddInput2.map)(x=>x.\u1->x.\u2.\u2)
//按键减少到聚合,选项用户可以直接使用joinData
//将结果包装到RDD中,然后写入txt文件的实际代码
joinData.reduceByKey((k1,k2)=>k1+k2.sortByKey().map(x=>x._1+“__”+x._2.collect().foreach(x=>{
val collectionTxt=数组[字符串](x);
sc.parallelize(collectionTxt)
.重新分配(1)
.saveAsTextFile(“+x”)
})
`


我希望它能帮助您尝试做什么…

正确,您不能在另一个rdd中包含一个rdd。使用数据帧和
partitionby
获取不同的文件怎么样?
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)
})