将RDD添加到DataFrame列PySpark

时间:2017-05-21 20:36:49

标签: python sql apache-spark dataframe rdd

我想创建一个包含两个RDD列的Dataframe。 第一个是从CSV获得的RDD,第二个是另一个RDD,每行有一个簇预测。

我的架构是:

customSchema = StructType([ \
StructField("Area", FloatType(), True), \
StructField("Perimeter", FloatType(), True), \
StructField("Compactness", FloatType(), True), \
StructField("Lenght", FloatType(), True), \
StructField("Width", FloatType(), True), \
StructField("Asymmetry", FloatType(), True), \
StructField("KernelGroove", FloatType(), True)])

映射我的rdd并创建DataFrame:

FN2 = rdd.map(lambda x: (float(x[0]), float(x[1]),float(x[2]),float(x[3]),float(x[4]),float(x[5]),float(x[6])))
 df = sqlContext.createDataFrame(FN2, customSchema)

我的群集预测:

result = Kmodel.predict(rdd)

因此,总而言之,我希望在我的DataFrame中包含我的CSV行和最后的群集预测。

我尝试使用.WithColumn()添加一个新列,但我什么都没有。

感谢。

1 个答案:

答案 0 :(得分:0)

如果两个数据框上都有公共字段,则使用密钥加入,否则创建唯一的Id并加入两个数据帧以在单个数据帧中获取CSV行及其簇预测

Scala代码为每一行生成一个唯一的id,尝试转换为pyspark。您需要生成增加的行ID并使用行ID

将它们连接起来
import org.apache.spark.sql.types.{StructType, StructField, LongType}
val df = sc.parallelize(Seq(("abc", 2), ("def", 1), ("hij", 3))).toDF("word", "count")
val wcschema = df.schema
val inputRows = df.rdd.zipWithUniqueId.map{
   case (r: Row, id: Long) => Row.fromSeq(id +: r.toSeq)}
val wcID = sqlContext.createDataFrame(inputRows, StructType(StructField("id", LongType, false) +: wcschema.fields))

或使用sql查询

val tmpTable1 = sqlContext.sql("select row_number() over (order by count) as rnk,word,count from wordcount")
tmpTable1.show()