2016-08-12 4 views
0

Мой код:PrintWriter рассматривает только один слэш вместо двойной слэш в пути HDFS

val df = sqlContext.read 
     .format("com.databricks.spark.xml") 
     .option("rowTag", header) 
     .load("/input/du3_init.dat") 
val dfCI2 = df.select("CI2") 
dfCI2.printSchema() 
val path="hdfs://nameservice/user/CI2_Schema" 
new PrintWriter(path) { write(dfCI2.schema.treeString);close} 

Когда я исполняю в искру, я получаю

Exception in thread "main" java.io.FileNotFoundException: hdfs:/nameservice/user/CI2_Schema (No such file or directory) 
     at java.io.FileOutputStream.open(Native Method) 
     at java.io.FileOutputStream.<init>(FileOutputStream.java:221) 
     at java.io.FileOutputStream.<init>(FileOutputStream.java:110) 

Только один слэш присутствует в путь hdfs, указанный в исключении. Как решить эту проблему ?. Заранее спасибо

+0

'PrintWriter' не должен понимать сетевые пути, такие как' hdfs: // 'или' ftp: // '. Его работы с локальной файловой системой. А в локальных файловых системах пути имеют формат 'a/b/c'. –

ответ

1

Если вы хотите написать hdfs, вы не можете использовать PrintWriter. PrintWriter не должен понимать сетевые пути, например, с hdfs:// или ftp://. Он работает с локальной файловой системой.

Вы можете написать hdfs, получив конфигурацию формы конфигурации hdfs.

import org.apache.hadoop.fs.FileSystem 
import java.io.BufferedOutputStream 


val hdfsConf = sparkContext.hadoopConfiguration 

val fileSystem: FileSystem = FileSystem.get(hdfsConf) 

val filePath = "hdfs://nameservice1/user/dhdpbankcrtbtch/CIW2_Schema" 

val hdfsFileOS: FSDataOutputStream = fileSystem.create(new Path(filePath)); 

// create a buffered output stream using the FSDataOutputStream 
val bos = new BufferedOutputStream(hdfsFileOS) 

bos.write(dfCIW2.schema.treeString.toBytes("utf-8")) 

bos.close() 
+0

Большое спасибо Sarvesh. – Sibikrish