我正在构建一个相当大的模式,因此我使用文档中的progamatical模式创建示例。
val schemaString = "field1,...,field126"
val schema = StructType(schemaString.split(",").map(fieldName => StructField(fieldName.trim, StringType, true)))
这很好但我需要将所有字段都作为ML函数的DoubleType。我将StringType更改为DoubleType,然后出错。
val schemaString = "field1,...,field126"
val schema = StructType(schemaString.split(",").map(fieldName => StructField(fieldName.trim, DoubleType, true)))
错误:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double
at scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:119)
我知道我可以转而手动创建架构但是有126个字段,代码变得笨重。
val schema = new StructType()
.add("ColumnA", IntegerType)
.add("ColumnB", StringType)
val df = sqlContext.read
.schema(schema)
.format("com.databricks.spark.csv")
.delimiter(",")
.load("/path/to/file.csv")
答案 0 :(得分:1)
我认为没有必要传递你自己的架构,它会自动推断它,如果你的csv文件包含列的名称,那么如果你将标题设置为 true
这将简单地工作(未经测试):
val df = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.option("inferSchema", "true")
.load("data/sample.csv")
它会给你一个数据帧,如果你有列名,那么只需将header设置为true!