spark上传文件和追加文件到hdfs

16 篇文章 0 订阅
14 篇文章 0 订阅

一、代码实现

package com.xtd.hdfs

import java.io.File

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, FileUtil, Path}

import scala.collection.mutable.{ArrayBuffer, ListBuffer}

object HDFSUtils {

  def main(args: Array[String]): Unit = {
    val status = uploadFile("C:\\Users\\com\\Desktop\\测试数据\\","/test/file/","报销单.docx")
    if(status) println("上传成功!") else println("上传失败")
  }

  /**
   * 本地文件上传到 hdfs
   * @param localDirectory 本地目录
   * @param hdfsDirectory  hdfs目录
   * @param fileName       文件名称
   * @return true:上传成功  flase:上传失败
   */
  def uploadFile(localDirectory:String,hdfsDirectory:String,fileName:String): Boolean = {

    val configuration:Configuration = new Configuration()
    val fileSystem:FileSystem = FileSystem.get(configuration)

    val localFullPath = localDirectory+"/"+fileName
    val hdfsFullPath = hdfsDirectory+"/"+fileName

    val localPath = new Path(localFullPath)
    val hdfspath = new Path(hdfsDirectory)
    val hdfsfilepath = new Path(hdfsFullPath)

    val status1 = new File(localFullPath).isFile
    val status2 = fileSystem.isDirectory(hdfspath)
    val status3 = fileSystem.exists(hdfsfilepath)
    println(status1,status2,!status3)

    // 本地文件存在,hdfs目录存在,hdfs文件不存在(防止文件覆盖)
    if(status1 && status2 && !status3) {
      fileSystem.copyFromLocalFile(false,false,localPath,hdfsfilepath)
      return true
    }
    false
  }

}

二、代码说明

这里做了三个判断

status1:本地文件存在
status2:hdfs目录存在
status3:hdfs文件不存在

查看源码,删除代码就一个 copyFromLocalFile方法,为啥写这么复杂呢??

    public void copyFromLocalFile(boolean delSrc, boolean overwrite, Path src, Path dst) throws IOException {
        Configuration conf = this.getConf();
        FileUtil.copy(getLocal(conf), src, this, dst, delSrc, overwrite, conf);
    }

原因一:FileSystem类 的 copyFromLocalFile方法没有返回值,但是业务需要知道上传状态

原因二:copyFromLocalFile方法的 hdfs Path 可以写上传的目录也可以写成 目录+文件名

但是,如果本来输入的 hdfs是目录,但是由于这个路径不存在,copyFromLocalFile方法会把

最后一个目录的当成文件的名称当成文件名上传至hdfs,文件名后缀没了,而且容易造成混乱

三、运行效果

四、写入文件 

hadoop不推荐追加文件到hdfs,如果需要追加文件有两个思路

1、先把内容追加到本地文件,再从本地上传到 hdfs(大数据场景下推荐使用)

2、用集合或者String数组先把追加的缓存,最后再一次性追加到hdfs (小数据或系统内存大的场景下)

hadoop 默认关闭hdfs文件追加功能,开启需要配置 hdfs-site.xml 文件

<property>
	<name>dfs.support.append</name>
	<value>true</value>
</property>

实现代码 

val configuration:Configuration = new Configuration()
val fileSystem:FileSystem = FileSystem.get(configuration)
val path:Path = new Path("xxx")
fileSystem.append(path)

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spark保存文件HDFS有两个关键步骤:指定文件保存位置和调用保存方法。 首先,我们需要指定文件保存的位置。在Spark中,可以使用`saveAsTextFile()`方法来指定文件的保存位置。该方法接受一个HDFS路径作为参数,表示文件保存的目录。 接下来,我们需要调用`saveAsTextFile()`方法来保存文件HDFS。在调用该方法之前,需要创建一个Spark RDD来保存文件内容。可以通过数据处理操作(比如`map()`、`filter()`等)来创建一个RDD,并将其保存到HDFS。 下面是一个示例代码,演示了如何将Spark RDD保存为文本文件HDFS: ```scala import org.apache.spark.SparkConf import org.apache.spark.SparkContext object SaveFileToHDFS { def main(args: Array[String]): Unit = { // 创建SparkConf对象 val conf = new SparkConf().setAppName("SaveFileToHDFS").setMaster("local") // 创建SparkContext对象 val sc = new SparkContext(conf) // 创建一个RDD val data = sc.parallelize(Seq("Hello", "World", "Spark")) // 指定文件保存路径 val savePath = "hdfs://localhost:9000/user/output/" // 保存RDD为文本文件HDFS data.saveAsTextFile(savePath) // 关闭SparkContext sc.stop() } } ``` 在上述示例中,首先创建了一个名为`SaveFileToHDFS`的Spark应用程序。然后,通过`SparkConf`对象设置了一些Spark的配置,如应用程序的名称和运行模式。 接下来,通过`SparkContext`对象创建了一个SparkContext,作为创建RDD的入口点。 然后,使用`parallelize()`方法创建了一个包含字符串的RDD。 接下来,指定了文件的保存路径。 最后,调用`saveAsTextFile()`方法,将RDD保存为文本文件HDFS指定的保存路径中。 当应用程序执行完成后,文件将被保存到HDFS中,并且可以通过HDFS的路径进行访问和查看。 需要注意的是,要保证HDFS的服务已经启动,并且文件保存路径在HDFS上是可写的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日月星辰TEL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值