私はさまざまなファイルのパスを含むHDFSファイルを持っています。ここFILE1と呼ばれるファイルは、次のとおりです。Scalaスパークループはエラーなしで処理されますが、出力は生成されません
path/of/HDFS/fileA
path/of/HDFS/fileB
path/of/HDFS/fileC
.
.
.
上記のファイルのそれぞれの行を読んで、別の関数で、それを処理するために、次のように私はScalaのスパークにforループを使用しています:
val lines=Source.fromFile("path/to/file1.txt").getLines.toList
for(i<-lines){
i.toString()
val firstLines=sc.hadoopFile(i,classOf[TextInputFormat],classOf[LongWritable],classOf[Text]).flatMap {
case (k, v) => if (k.get == 0) Seq(v.toString) else Seq.empty[String]
}
}
私が実行したとき上記のループは、エラーを返さずに実行され、新しい行にScalaプロンプトが表示されます:scala>
しかし、私はfirstLinesに格納される出力をいくつか見てみると、仕事:
scala> firstLines
<console>:38: error: not found: value firstLines
firstLine
^
出力を生成していない上記のループの問題は何も問題なく実行されますか?
追加情報 hadoopFileは、その最初のパラメータとして文字列のパス名を受け付ける関数。それで、私はfile1の各行(各行はパス名)を最初のパラメータiのStringとして渡そうとしているのです。 flatMapの機能は、hadoopFileに渡されたファイルの最初の行を取得し、それを単独で格納し、他のすべての行をダンプします。したがって、目的の出力(firstLines)は、パス名(i)でhadoopFileに渡されるすべてのファイルの最初の行にする必要があります。
私はlooopせずに、単に1つのファイルに対して機能を実行してみました、それは出力を生成します。
val firstLines=sc.hadoopFile("path/of/HDFS/fileA",classOf[TextInputFormat],classOf[LongWritable],classOf[Text]).flatMap {
case (k, v) => if (k.get == 0) Seq(v.toString) else Seq.empty[String]
}
scala> firstLines.take(3)
res27: Array[String] = Array(<?xml version="1.0" encoding="utf-8"?>)
FILEAはXMLファイルであるので、あなたは、そのファイルの結果の最初の行を見ることができます。だから私は関数が正常に動作することを知っている、それは私が把握することはできませんループの単なる問題です。助けてください。
非常に明確だったことと、詳細な説明!私は今なぜforループが機能していないのか理解しています。あなたのソリューションを使用して、私はその結果を達成することができます。本当にありがとう! – PreethiS
私はそれが助けてうれしいです!ありがとう –