问题陈述: 我正在尝试在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)}
答案 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)
})
`
我希望它可以帮助您完成尝试的工作...