如何在Scala中以本机方式(不使用Spark)从HDFS读取文本文件?

如何在Scala中以本机方式(不使用Spark)从HDFS读取文本文件?,scala,hadoop,hdfs,text-files,apache-toree,Scala,Hadoop,Hdfs,Text Files,Apache Toree,我知道我可以在Scala中读取本地文件,如下所示: 它也可以正常工作,我可以看到以下输出: -rw-r--r-- 3 hdfs hdfs 1979173 2020-04-20 17:56 /labs/laba01/ml-100k/u.data lastException: Throwable = null warning: there was one feature warning; re-run with -feature for details 0 现在,我想通过运行以下命令

我知道我可以在Scala中读取本地文件,如下所示:

它也可以正常工作,我可以看到以下输出:

-rw-r--r--   3 hdfs hdfs    1979173 2020-04-20 17:56 /labs/laba01/ml-100k/u.data

lastException: Throwable = null
warning: there was one feature warning; re-run with -feature for details

0
现在,我想通过运行以下命令读取HDFS中保存的相同文件:

import scala.io.Source

val filename = "hdfs:/labs/laba01/ml-100k/u.data"

for(line <- Source.fromFile(filename).getLines){
    println(line)
}
但我得到的是这个输出,而不是打印出来的文件行:

lastException = null

Name: java.io.FileNotFoundException
Message: hdfs:/labs/laba01/ml-100k/u.data (No such file or directory)
StackTrace:   at java.io.FileInputStream.open0(Native Method)
  at java.io.FileInputStream.open(FileInputStream.java:195)
  at java.io.FileInputStream.<init>(FileInputStream.java:138)
  at scala.io.Source$.fromFile(Source.scala:91)
  at scala.io.Source$.fromFile(Source.scala:76)
  at scala.io.Source$.fromFile(Source.scala:54)
那么如何从HDFS读取此文本文件呢?

scala.io将无法在HDFS中找到任何文件。不是为了这个。如果我没有错,它只能读取本地文件中的文件:///

您需要使用hadoop-common.jar从HDFS读取数据

您可以在这里找到代码示例 scala.io将无法在HDFS中找到任何文件。不是为了这个。如果我没有错,它只能读取本地文件中的文件:///

您需要使用hadoop-common.jar从HDFS读取数据

您可以在这里找到代码示例

这是否回答了您的问题@mazaneicha不,因为1它不起作用,在那里要求更多的解释有点老了,但我会试试。在我运行代码时,有一个URI对象导致未知错误。2它需要一些主机和端口,我并不关心这些,因为我可以从运行Scala代码的同一台服务器访问HDFS。这是HDFS NameNode的主机和端口,您需要它们来访问HDFS文件系统。这是否回答了您的问题@mazaneicha不,因为1它不起作用,在那里要求更多的解释有点老了,但我会试试。在我运行代码时,有一个URI对象导致未知错误。2它需要一些主机和端口,我并不真正关心这些,因为我可以从运行Scala代码的同一台服务器访问HDFS。这是HDFS NameNode的主机和端口,您需要它们来访问HDFS文件系统。这些代码不起作用,需要更多解释也有点旧,但我会尝试。在我运行代码时,有一个URI对象导致未知错误。它需要一些主机和端口,我并不真正关心这些,因为我可以从运行Scala代码的同一台服务器访问HDFS。是的,它需要名称服务器主机和端口。或者,如果服务在同一个节点上运行,请将hdfs:///注意URI中的3/,那么新URI中的URI呢?这是什么?我如何导入?非常感谢!hdfs:///成功了!我将URI作为import java.net.URIYes导入,就是这个。如果您的名称服务器位于另一个节点上,那么您必须指定host:port,因为该代码不起作用,而且在那里要求更多解释有点旧,但我会尝试。在我运行代码时,有一个URI对象导致未知错误。它需要一些主机和端口,我并不真正关心这些,因为我可以从运行Scala代码的同一台服务器访问HDFS。是的,它需要名称服务器主机和端口。或者,如果服务在同一个节点上运行,请将hdfs:///注意URI中的3/,那么新URI中的URI呢?这是什么?我如何导入?非常感谢!hdfs:///成功了!我将URI作为import java.net.URIYes导入,就是这个。如果名称服务器位于其他节点上,则必须指定主机:端口
import scala.io.Source

val filename = "hdfs:/labs/laba01/ml-100k/u.data"

for(line <- Source.fromFile(filename).getLines){
    println(line)
}
lastException = null

Name: java.io.FileNotFoundException
Message: hdfs:/labs/laba01/ml-100k/u.data (No such file or directory)
StackTrace:   at java.io.FileInputStream.open0(Native Method)
  at java.io.FileInputStream.open(FileInputStream.java:195)
  at java.io.FileInputStream.<init>(FileInputStream.java:138)
  at scala.io.Source$.fromFile(Source.scala:91)
  at scala.io.Source$.fromFile(Source.scala:76)
  at scala.io.Source$.fromFile(Source.scala:54)