Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Pyspark中转换一列数据帧,同时保持其余数据帧不变?_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 如何在Pyspark中转换一列数据帧,同时保持其余数据帧不变?

Python 如何在Pyspark中转换一列数据帧,同时保持其余数据帧不变?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,例如,我有一个数据帧 df.show() +---+-----+ |age| name| +---+-----+ | 1|Alice| | 2| Bob| | 4| Bill| +---+-----+ 现在,我想以这样一种方式进行转换,即name列变为struct类型,其中有两列“name\u id”,现在所有值都可以为0,而“name\u text”是name列中的值。 注意:df可以更改。因此,我无法硬编码模式。它必须是动态的。 比如说,如果我需要这样一个函数 func(df)

例如,我有一个数据帧

df.show()
+---+-----+
|age| name|
+---+-----+
|  1|Alice|
|  2|  Bob|
|  4| Bill|
+---+-----+ 
现在,我想以这样一种方式进行转换,即name列变为struct类型,其中有两列“name\u id”,现在所有值都可以为0,而“name\u text”是name列中的值。 注意:df可以更改。因此,我无法硬编码模式。它必须是动态的。 比如说,如果我需要这样一个函数

func(df)
应该给出一个df作为

+---+---------+
|age|     name|
+---+---------+
|  1|[0,Alice]|
|  2|  [0,Bob]|
|  4| [0,Bill]|
+---+---------+
这将是一个巨大的帮助谢谢你

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
因此,您调用map函数

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