2017-02-04 51 views
0

我想在從json讀取時指定模式,但是當嘗試將數字映射到Double時失敗,我嘗試使用FloatType和IntType而沒有快樂!通過Spark在JSON上指定模式

當推斷架構客戶ID設置爲字符串,我想將它轉換爲Double

所以DF1被損壞而DF2顯示

也僅供參考,我需要爲我想這是通用喜歡它適用於任何JSON,我指定的以下模式作爲問題的一個例子,我現在面臨

import org.apache.spark.sql.types.{BinaryType, StringType, StructField, DoubleType,FloatType, StructType, LongType,DecimalType} 
val testSchema = StructType(Array(StructField("customerid",DoubleType))) 
val df1 = spark.read.schema(testSchema).json(sc.parallelize(Array("""{"customerid":"535137"}"""))) 
val df2 = spark.read.json(sc.parallelize(Array("""{"customerid":"535137"}"""))) 
df1.show(1) 
df2.show(1) 

任何幫助,將不勝感激,我相信我失去了一些東西明顯,但對於我,我的生活不能告訴它是什麼!

讓我澄清一下,我加載一個使用sparkContext.newAPIHadoopRDD

所以轉換RDD [JSONObject的]到數據幀,而應用模式,以它

回答

0

JSON的領域,因爲通過封閉保存的文件雙引號被視爲String。如何將列轉換爲Double ?.如果需要提供什麼樣的色譜柱預計將轉化爲Double的詳細信息,則可以將該澆鑄解決方案製作成通用的。

df1.select(df1("customerid").cast(DoubleType)).show() 
+----------+ 
|customerid| 
+----------+ 
| 535137.0| 
+----------+ 
+0

嗨@流氓 - 一個可悲的不知道如何做到這一點,因爲我從類似HDFS的存儲,谷歌存儲加載數據是確切的。那麼是否有更好的方法比映射每一行並刪除雙引號? –