对于两个输入文件A和B,编写Spark独立应用程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C。下面是输入文件和输出文件的一个样例,供参考。
输入文件A的样例如下:
20170101 x
20170102 y
20170103 x
20170104 y
20170105 z
20170106 z
输入文件B的样例如下:
20170101 y
20170102 y
20170103 x
20170104 z
20170105 y
根据输入的文件A和B合并得到的输出文件C的样例如下:
20170101 x
20170101 y
20170102 y
20170103 x
20170104 y
20170104 z
20170105 y
20170105 z
20170106 z
(1)已知数据文件A和B均在HDFS上。
(2)结果保存到MySql中,请设计结果表,并完整写出源码。
(3)将所有功能整合的一个客户端程序中。
IDEA 2022.2.3
Vmware
Hadoop 2.7.7
Spark 3.1.3
将数据文件上传至hdfs:
@Before
public void init() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master1:9000");
System.setProperty("HADOOP_USER_NAME", "root");
hdfs = FileSystem.get(conf);
}
@After
public void close() throws IOException {
if (hdfs != null) {
hdfs.close();
}
}
@Test
public void testUploadFileToHDFS() throws IOException {
final String localFilePath = "e:/HDFS/A.txt";
final String hdfsFilePath = "/RDD/output/A.txt";
try (FileSystem hdfs = FileSystem.get(new Configuration())) {
Path src = new Path(localFilePath);
Path dst = new Path(hdfsFilePath);
hdfs.copyFromLocalFile(src, dst);
System.out.println("上传成功");
} catch (IOException e) {
e.printStackTrace();
}
}}
合并:
import org.apache.spark.sql.SparkSession
object Main {
def main(args: Array[String]) {
val spark = SparkSession.builder.appName("MergeAndSaveToMySQL").getOrCreate()
// 读取输入文件A和B,并为每个字段指定别名
val inputA = spark.read.text("/user/your_username/RDD/output/A.txt")
.selectExpr("value as id", "substring(value, 11, 1) as name") // 指定日期和字母字段
val inputB = spark.read.text("/user/your_username/RDD/output/B.txt")
.selectExpr("value as id", "substring(value, 11, 1) as name") // 指定日期和字母字段
// 合并两个数据集
val mergedData = inputA.union(inputB)
// 将结果保存到MySQL中
mergedData.write.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/myBase")
.option("dbtable", "result")
.option("user", "root")
.option("password", "123456")
.save()
spark.stop()
}
}
object MainClient {
def main(args: Array[String]): Unit = {
MergeAndDeduplicate.main(Array())
}
}