Сохранить XML-файл в HDFS

#xml #scala #apache-spark

#xml #scala #apache-spark

Вопрос:

У меня есть строка XML, и ее необходимо сохранить в папке HDFS.

 <transportation-carrier>
<SCAC>LKSKS</SCAC>
<name>JACKSONVILLE Name</name>
<billing-road-number>139</billing-road-number>
<effective-date>2017-03-08</effective-date>
<expiration-date>2017-03-07</expiration-date>
</transportation-carrier>
  

Я попытался сохранить этот XML-элемент в abc в путь в HDFS с помощью команды save —

  scala.xml.XML.save("/data/temp/example.xml", abc)
  

Я получаю это сообщение об ошибке —

Исключение в потоке «main» java.io.FileNotFoundException: datatempexample.xml (Система не может найти указанный путь)

Я был бы признателен за помощь в сохранении файла в путь к HDFS.

Комментарии:

1. Я не уверен, используете ли вы здесь SPARK. Если вы пытаетесь записать файл из автономного приложения Scala, вы можете попробовать проверить hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs /…

2. Я использую Spark для подключения к кластеру.

3. Я не вижу никаких ссылок на контекст Spark и RDD как таковые в вашем коде. Если вы используете эти вещи, вы могли бы использовать API rdd.saveAsXXX

Ответ №1:

В итоге я преобразовал string XML в XML-файл, а затем преобразовал его в file в dataframe, используя пакет databricks для Scala

Ответ №2:

Предполагая, что Spark и Hadoop env, другой способ сделать это — использовать java.io и метод XML.write вместо save .

Это избавляет от необходимости использования промежуточного файла:

 import org.apache.hadoop.fs.{ FileSystem, Path, FSDataOutputStream }
import java.io.BufferedWriter
import java.io.OutputStreamWriter

val xmlRoot : Elem = <myElem>test</myElem>
val path: Path = new Path("hdfs:///myfile.xml")
if (fs.exists(path)) {
   fs.delete(path, true)
}
val dataOutputStream: FSDataOutputStream = fs.create(path)
val bw: BufferedWriter = new BufferedWriter(new OutputStreamWriter(dataOutputStream, "UTF-8"))
XML.write(bw, xmlRoot, "utf-8", xmlDecl = true, doctype = null)
bw.close()
  

Работает на Cloudera Zeppelin env.