如何在保留Pyspark中其余数据帧不变的同时转换数据帧列?

时间:2018-08-03 21:10:11

标签: python apache-spark pyspark

例如,我有一个数据框

df.show()
+---+-----+
|age| name|
+---+-----+
|  1|Alice|
|  2|  Bob|
|  4| Bill|
+---+-----+ 

现在我想以这样的方式进行转换,即名称列成为结构类型,其中两列“ name_id”现在可以为所有值提供0,而“ name_text”即为名称列中的值。 注意:df可以更改。所以我不能硬编码架构。它必须是动态的。 因此,例如,如果我需要这样的功能

func(df)

应该给df作为

+---+---------+
|age|     name|
+---+---------+
|  1|[0,Alice]|
|  2|  [0,Bob]|
|  4| [0,Bill]|
+---+---------+

这将对您有很大帮助。

1 个答案:

答案 0 :(得分:-2)

def generate_intial_transform_schema(df,column_id):
    index= 0
    schemaList = []
    for schema in df.schema:
        if index == column_id:
            schemaList.append(
            StructField(schema.name,StructType([
                StructField("value",schema.dataType,schema.nullable),
                StructField("id",schema.dataType,True),
                ]),True))
        else:
            schemaList.append(schema)
        index += 1
    generated_schema = StructType(schemaList)
    return generated_schema

def intial_transform(lines,column_id):

    return_touple = ()
    for i in range(0,len(df.columns)):
        if i!= column_id:
            return_touple = return_touple+(lines[i],)
        else:
            return_touple = return_touple+((lines[i],1),)
    return return_touple

所以,您调用地图函数

df2 = df1.rdd.map(
lambda lines:intial_transform(lines,1)
).toDF(
generate_intial_transform_schema(lines,1)
)