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”])
来避免它。啊,第二个选项绝对是我想要的!非常感谢。啊,第二个选择绝对是我想要的!非常感谢。