如何将String列表写入HDFS文件?现有Scala代码编译报错求解决
解决方法:适配List[String]输入并正确写入HDFS
首先,你的编译错误核心原因很明确:函数fileFromList的input参数被定义为String类型,但你传入的是List[String],类型不匹配直接导致编译失败。接下来我们修改函数来支持列表输入,同时优化HDFS资源的管理(避免手动关闭可能引发的资源泄漏问题)。
修正后的完整代码
import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.hadoop.conf.Configuration import java.io.BufferedOutputStream def fileFromList(input: List[String], outputPath: String): Unit = { val conf = new Configuration() val hdfs = FileSystem.get(conf) val path = new Path(outputPath) // 用嵌套try-finally确保所有流和连接都能被正确关闭 val output = hdfs.create(path) try { val outt = new BufferedOutputStream(output) try { // 遍历列表,将每个元素转为字节,同时添加换行符分隔每行 input.foreach { line => outt.write(line.getBytes) outt.write('\n') // 保证文件内容按行展示,更易读 } } finally { outt.close() } } finally { output.close() hdfs.close() } } // 测试调用 val input = List( "banana apple strawberry", "Apple banana strawberry" ) val outputpath = "/folder/test.YMSL" fileFromList(input, outputpath)
关键修改点说明
- 参数类型适配:把
input的类型从String改为List[String],完全匹配你实际传入的输入类型,解决编译错误的根源。 - 列表元素遍历写入:添加
input.foreach循环,逐个处理列表中的每一行字符串,同时在每行末尾写入换行符,保证输出文件的内容结构清晰。 - 安全的资源管理:用嵌套的
try-finally块确保所有流和HDFS连接都能被正确关闭,避免因代码抛出异常导致的资源泄漏。如果你使用Scala 2.13及以上版本,还可以用scala.util.Using来简化资源管理:import scala.util.Using def fileFromList(input: List[String], outputPath: String): Unit = { val conf = new Configuration() val hdfs = FileSystem.get(conf) val path = new Path(outputPath) Using(hdfs.create(path)) { output => Using(new BufferedOutputStream(output)) { outt => input.foreach { line => outt.write(line.getBytes) outt.write('\n') } } } hdfs.close() } - 可选字符集优化:如果需要指定统一字符集(比如UTF-8),可以把
line.getBytes改成line.getBytes("UTF-8"),避免依赖系统默认字符集引发的编码问题。
内容的提问来源于stack exchange,提问作者user9793373
相关产品推荐
相关产品推荐

