如何以编程方式创建不是StringType的Dataframe

时间:2016-10-20 12:33:45

标签: scala apache-spark spark-dataframe

我正在构建一个相当大的模式,因此我使用文档中的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")

1 个答案:

答案 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!