将Vector集合转换为数据框时发生架构错误

时间:2019-01-04 15:35:18

标签: scala apache-spark

我有一个名为values的向量集合,我正在尝试将其转换为数据帧

scala.collection.immutable.Vector[(String, Double)] = Vector((1,1.0), (2,2.4), (3,3.7), (4,5.0), (5,4.9))

我已经定义了以下自定义架构,并尝试进行转换。

val customSchema = new StructType()
    .add("A", IntegerType, true)
    .add("B", DoubleType, true)

val df = values.toDF.schema(customSchema)

这给了我一个错误,说

error: overloaded method value apply with alternatives:
  (fieldIndex: Int)org.apache.spark.sql.types.StructField <and>
  (names: Set[String])org.apache.spark.sql.types.StructType <and>
  (name: String)org.apache.spark.sql.types.StructField
 cannot be applied to (org.apache.spark.sql.types.StructType)

我尝试了herehere以及StructType documentation描述的所有方法来创建模式。但是,所有方法都导致相同的自定义架构customSchema: org.apache.spark.sql.types.StructType = StructType(StructField(A,IntegerType,true), StructField(B,DoubleType,true))

toDF方法在没有自定义架构的情况下也可以正常工作。但是我想强制自定义架构。有人可以告诉我我在做什么错吗?

1 个答案:

答案 0 :(得分:4)

schema是一个属性。要获取StructTypeDataFrame中的Dataset时,应使用架构。

val df = values.toDF
df.schema
//prints
StructType(StructField(_1,IntegerType,false), StructField(_2,DoubleType,false))

要将向量转换为DataFrameDataset,可以使用spark.createDataFramespark.createDataset。这些方法已重载,它们期望RDDJavaRDDjava.util.ListRow和架构信息。您可以执行以下操作将Vector转换为DataFrame

val df = spark.createDataFrame(vec.toDF.rdd, customSchema)
df.schema
//prints
StructType(StructField(A,IntegerType,true), StructField(B,DoubleType,true))

希望对您有帮助!