Я пытаюсь извлечь элементы из записей XML, где каждый файл XML имеет много записей XML.Ниже приведен модифицированный код и пример xmls, который я использую.
Я ожидаю массив строк, в котором каждый элемент массива равен "user:id"
, но результат равен ":"
.Я ожидал, что XML.loadString
проанализирует каждый файл, и результатом будут отдельные записи XML.То есть, если я возьму два примера файлов в качестве примера, я получу 4 записи XML.На самом деле это два.
После добавления println(d)
после получения next
я получаю всю строку, представляющую файл, что, вероятно, объясняет, почему функции getId
и getUser
не являютсяничего не возвращая.
Неправильно ли я обрабатываю нагрузку?
import org.apache.spark.{SparkConf, SparkContext}
import scala.xml._
import scala.collection.mutable.ArrayBuffer
object Details {
def getDetails(xmlstring: String): Iterator[Node] = {
val nodes = XML.loadString(xmlstring)
nodes.toIterator
}
def getId(detail: Node): String = {
(detail \ "id").text
}
def getUser(detail: Node): String = {
(detail \ "user").text
}
def getDetailList(details: Iterator[Node]): Array[String] = {
var list = ArrayBuffer[String]()
while (details.hasNext) {
val d = details.next
val user = getUser(d)
val id = getId(d)
val formattedText = user + ":" + id
list += formattedText
}
list.toArray
}
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Details")
val sc: SparkContext = new SparkContext(conf)
val lines = sc.wholeTextFiles("file:///path/to/files/")
val xmlStrings = lines.map(line => line._2)
val detailsRecords = xmlStrings.map(getDetails)
val detailsList = detailsRecords.map(getDetailList)
spark.stop()
}
}
И два файла с примерами ...
test.xml
<details>
<detail>
<user>Dan</user>
<id>5555</id>
</detail>
<detail>
<user>Mike</user>
<id>6666</id>
</detail>
</details>
test2.xml
<details>
<detail>
<user>John</user>
<id>1234</id>
</detail>
<detail>
<user>Joe</user>
<id>5678</id>
</detail>
</details>