python - 如何在 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]|
+---+---------+
这将是一个巨大的帮助,谢谢。
解决方案
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)
)
推荐阅读
- python - 如何根据一列的字符串相似性链接两个数据框
- linux - sed 搜索文件中带有特殊字符的字符串
- node.js - 快速响应拦截。使用 body 修改传出标头
- python - 导入代码在输入到 Shell 时有效。但不是在运行 py.script 时?
- php - 将 gis 点批量转换为纬度/经度
- twilio - 我们可以限制发送到单个手机号码的短信(文本)数量吗?
- android - 发布 http 请求:在 null 颤动上调用了 getter 'length'
- c# - 如何以其他派生类作为属性反序列化派生类
- c# - Linq计算时差并选择最接近的一个
- java - 如何在 Corda 中实现多方逻辑