Pyspark 转换列并更新数据帧

Pyspark 转换列并更新数据帧,pyspark,spark-dataframe,Pyspark,Spark Dataframe,因此,我下面要做的是从DataFrame中删除一列a,因为我想应用一个转换(这里我只是json.loadsjson字符串),并用转换后的列替换旧列。在转换之后,我只是将两个结果数据帧连接起来 df=df_data.drop('A')。join( df_数据[['ID','A']].rdd\ .map(lambda x:(x.ID,json.load(x.A)) 如果x.A不是其他(x.ID,无))\ .toDF()\ .WithColumnRename(“”“1”,“ID”)\ .WithCol

因此,我下面要做的是从
DataFrame
中删除一列
a
,因为我想应用一个转换(这里我只是
json.loads
json字符串),并用转换后的列替换旧列。在转换之后,我只是将两个结果数据帧连接起来

df=df_data.drop('A')。join( df_数据[['ID','A']].rdd\ .map(lambda x:(x.ID,json.load(x.A)) 如果x.A不是其他(x.ID,无))\ .toDF()\ .WithColumnRename(“”“1”,“ID”)\ .WithColumn重命名为(“2”、“A”), ['ID'] ) 我不喜欢这一点的原因当然是我面临的开销,因为我必须用ColumnRenamed执行
操作

有了熊猫,我会这样做:

pdf=pd.DataFrame([json.dumps([0]*np.random.randint(5,10))用于范围(10)]中的i,列=['A'])
pdf.A=pdf.A.map(lambda x:json.loads(x))
pdf
但以下内容在pyspark中不起作用:

df.A=df[['A']].rdd.map(lambda x:json.loads(x.A))

那么,有没有比我在第一次截取的代码中所做的更简单的方法呢?

从我的理解来看,你是想实现这样的目标吗

导入pyspark.sql.F函数
导入json
json_convert=F.udf(lambda x:json.load(x),如果x不是None-else-None)
cols=df_data.columns
df=df_数据。选择([json_convert(F.col('A')))。别名('A')])+\
[col表示col,如果col!=“A”])

据我所知,您是否正试图实现这样的目标

导入pyspark.sql.F函数
导入json
json_convert=F.udf(lambda x:json.load(x),如果x不是None-else-None)
cols=df_data.columns
df=df_数据。选择([json_convert(F.col('A')))。别名('A')])+\
[col表示col,如果col!=“A”])

我认为您不需要删除该列并进行连接。以下代码*应与您发布的代码等效:

cols=df_data.columns
df=df_data.rdd\
.地图(
lambda行:元组(
[c]行如果c!=“A”else(json.loads(c)行如果[c]行不是None-else None)
对于c,单位为cols]
)
)\
.toDF(科尔斯)
*我还没有实际测试过这段代码,但我认为这应该可以工作

但要回答您的一般问题,可以使用
withColumn()
就地转换列

df=df_data.withColumn(“A”,my_transformation_函数(“A”)。别名(“A”))

其中
my\u transformation\u function()
可以是
udf
pyspark sql函数

,我认为您不需要删除列并进行联接。以下代码*应与您发布的代码等效:

cols=df_data.columns
df=df_data.rdd\
.地图(
lambda行:元组(
[c]行如果c!=“A”else(json.loads(c)行如果[c]行不是None-else None)
对于c,单位为cols]
)
)\
.toDF(科尔斯)
*我还没有实际测试过这段代码,但我认为这应该可以工作

但要回答您的一般问题,可以使用
withColumn()
就地转换列

df=df_data.withColumn(“A”,my_transformation_函数(“A”)。别名(“A”))

如果
my\u transformation\u function()
可以是
udf
pyspark-sql函数

这是我们能做的最简单的事情吗?恐怕是的:)不,你可以做一些更简单的事情:
df=df\u数据。使用列(“a”,json\u转换(F.col('a')。别名('a'))
我同意@pault的观点,我不知道我怎么会错过它,那太好了。谢谢你,梅亚克,但我会接受@pault的答案,因为它肯定更简单。但多亏了你们两个!这是我们能做的最简单的事情吗?恐怕是的:)不,你可以做一些更简单的事情:
df=df\u数据。使用列(“A”,json\u转换(F.col('A'))。别名('A'))
我同意@pault不知道我怎么会错过它,那太好了。谢谢你,梅亚克,但我会接受@pault的答案,因为它肯定更简单。但多亏了你们两个
.toDF()
可以为列名使用位置参数。如果您担心调用
with columnRenamed()
,您可以执行
toDF([“ID”,“A”])
来避免它。
.toDF()
可以使用列名的位置参数。如果您担心调用
with columnRenamed()
,您可以执行
toDF([“ID”,“A”])
来避免它。啊,第二个选项绝对是我想要的!非常感谢。啊,第二个选择绝对是我想要的!非常感谢。