来自现有RDD的数据框架--Python Spark

时间:2017-06-09 18:17:44

标签: apache-spark dataframe pyspark apache-spark-sql rdd

我正在尝试通过指定列标签和数据类型从现有RDD创建数据框,但我得到了这个Typeerror:

from pyspark.sql import SQLContext
from pyspark.sql.types import *

sqlContext = SQLContext(sc)
yFieldTypes = [FloatType()]
ySchemaString = "Predictor"
fy_data = [StructField(field_name, field_type, True) \
          for field_name, field_type in zip(ySchemaString.split(), yFieldTypes)]
schema_y = StructType(fy_data)

所以架构如下:

StructType(List(StructField(Predictor,FloatType,true)))

我的RDD datay.take(10)输出如下:

 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

当我想创建我的数据框时:

dfy = sqlContext.createDataFrame(datay, schema_y)

我得到了这个Typeerror:

TypeError: StructType(List(StructField(Predictor,FloatType,true))) can not accept object in type <type 'float'>   

2 个答案:

答案 0 :(得分:0)

那是因为它不是正确的架构。由于您具有原子类型,因此应直接使用FloatType

dfy = sqlContext.createDataFrame(datay, FloatType())

要使用当前模式,您应该使用元组:

dfy = sqlContext.createDataFrame(datay.map(lambda x: (x, )), schema_y)

答案 1 :(得分:-1)

问题是因为RDD属于Double类型而schema被定义为FloatType。您必须找到一种方法将Double rdds转换为Float

我没有与pyspark合作,但我将发布以下scala代码来帮助您。

val datay = sc.parallelize(Seq(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0))

val r = datay.map(d => Row.fromSeq(Seq(d.toFloat)))

val schema_y = StructType(List(StructField("Predictor", FloatType, true)))

val dfy = sqlContext.createDataFrame(r, schema_y)

我希望这有助于您达到所需的解决方案