import java.util.Date
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.Path
import org.apache.hadoop.io.compress.DeflateCodec
import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}
/**
* 读取小文件
*/
object Read2Save {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("Read2Save").setMaster("local[4]")
val sc: SparkContext = new SparkContext(conf)
sc.setLogLevel("WARN")
val rdd: RDD[String] = sc.textFile("hdfs://hadoop0:8020/flume/demo10")
rdd.persist(StorageLevel.MEMORY_AND_DISK_SER_2).count()
//rdd.foreach(println)
val a = new Date()
val path: Path = new Path("hdfs://hadoop0:8020/flume/demo10")
val hadoopConf: Configuration = sc.hadoopConfiguration
val hdfs = org.apache.hadoop.fs.FileSystem.get(hadoopConf)
hdfs.delete(path, true)
rdd.foreach(println)
rdd.repartition(1).saveAsTextFile("hdfs://hadoop0:8020/flume/demo10", classOf[DeflateCodec])
sc.stop()
}
}
要求:读取多个小文件,合并成一个大文件(在同一路径下),并删除所有的小文件
思路:1 先读取所有的小文件
2,保存到内存中
3 ,删除所有的小文件
4, 将内存中的小文件设置成1个大文件保存
遇到的坑:在将内存中的小文件合并成大文件保存到同一路径下的时候保存的文件是空的,查找原因是因为读取小文件放到内存中的时候没有action操作
解决方案 加上action操作 count()