需求:现在有几十张excle表,我需要从中获取某几个字段(a,b,c,d,e)汇总到一张表中,这些字段并不是每张表都具备。
Saprk DataFrame实现:
1. 构建上下文连接
//获取上下文链接,并设置日志的打印格式
Logger.getLogger("org").setLevel(Level.WARN)
val str = Array("a","b","c","d","e")
val conf = new SparkConf().setAppName("calculate").setMaster("local[*]")
val sc= new SparkContext(conf)
val ss = SparkSession.builder().master("local[*]").appName("app").getOrCreate()
2.先做一个获取所有表的方法
//先做一个获取文件夹下所有表格的方法
def getFile(path:String):Iterable[File]={
val file = new File(path)
file.listFiles()
}
3.spark不能直接读excle,需要先加入依赖
<!-- 读取excel xlsx-->
<dependency>
<groupId>com.crealytics</groupId>
<artifactId>spark-excel_2.11</artifactId>
<version>0.12.2</version>
</dependency>
4. 核心代码开始了,主要注意读取excle的参数配置和withcolumn方法
//设置读excle的参数
val reader = ss.read.format("com.crealytics.spark.excel").option("useHeader", "true")
// 根据之前的方法获取一个文件迭代器
val it = getFile(excle所在文件夹地址).iterator
//遍历excle,创建dataframe
while (it.hasNext){
var df = reader.load("file:///"+ it.next().toString)
//df.show(2)
for (elem <- str) {
//判断目标excle,是否包含这些字段,如果不包含使用withcolumn增加该字段
if (!df.columns.contains(elem)){
df=df.withColumn(elem, df(df.columns(1)) * 0)
df.withColumn(elem,monotonically_increasing_id())
}
}
df.select( "a","b","c","d","e")
.write.format("com.crealytics.spark.excel")
//添加的格式为追加,不覆盖
.mode("append")
//是否打印表头
.option("useHeader", "true").save("file:///保存地址")
}
ss.stop()