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