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

How to create a Dataframe programmatically that isn't StringType

我正在构建一个相当大的架构,因此我使用了文档中的编程架构创建示例。

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")

我认为没有必要传递你自己的架构,它会自动推断它,如果你的 csv 文件包含列的名称那么如果你将 header 设置为 .

这很简单(not-tested) :

val df = sqlContext.read
  .format("com.databricks.spark.csv")
  .option("header", "true")
  .option("inferSchema", "true")
  .load("data/sample.csv")

它会给你一个数据框,如果你有列名,那么只需将 header 设置为 true !