2016-05-18 42 views
3

我試圖將數據幀保存爲avro文件。我讀過一個有許多嵌套圖層的xml文件。它將其存儲爲數據框。數據幀已成功存儲。 XML有許多名​​稱空間頭文件,例如@nso,@ ns1,@ ns2等。這些成爲數據框中的頭文件。當我嘗試將其保存爲文件的Avro它給了我這個錯誤:主「在線程異常‘’org.apache.avro.SchemaParseException:非法首字符:@ NS0」在spark中過濾數據幀並保存爲avro

val conf = new SparkConf() 
     .setMaster("local[2]") 
     .setAppName("conversion") 
val sc = new SparkContext(conf) 

val sqlContext = new SQLContext(sc) 

val df = sqlContext.read 
    .format("com.databricks.spark.xml") 
    .option("rowTag", "Stuff") 
    .load("sample.xml") 

df.printSchema() 
df.show() 

df.write 
    .format("com.databricks.spark.avro") 
    .save("output") 

回答

1

有效的Avro名has to start with a letter or an underscore所以您可以重命名從屬性生成的列或指定替代前綴。 spark-csv允許您使用attributePrefix屬性來配置屬性前綴:

val df = sqlContext.read 
    .format("com.databricks.spark.xml") 
    .option("rowTag", "Stuff") 
    .option("attributePrefix", "attr_") // or some other prefix of your choice 
    .load("sample.xml") 
+0

我試過這個解決方案。它將成功替換xml的xmlns頭文件 - 帶有@符號的頭文件。但是,當嵌套層中的ns0,ns1元素仍然存在問題時。你知道如何取代這些嗎? – Defcon

+0

您能否介紹一下它失敗的小例子輸入?這聽起來像一個錯誤。 – zero323

+0

好的,所以剩下的問題是'ns1:PublicID'也不是一個有效的名字,由於':'?如果是這樣,我不認爲有另一種解決方案,而不是重命名,這不完全是嵌套對象。 – zero323