2017-02-04 48 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的存储,谷歌存储加载数据是确切的。那么是否有更好的方法比映射每一行并删除双引号? –