pyspark 如何将列中的文本替换为该文本中命名的列中包含的值

rsaldnfx  于 2023-01-08  发布在  Spark
关注(0)|答案(1)|浏览(125)

在pyspark中,我尝试用calc列(公式)中名称出现的列中的值替换一列中的多个文本值。
下面是一个例子:
输入:

|param_1|param_2|calc 
|-------|-------|--------
|Cell 1 |Cell 2 |param_1-param_2
|Cell 3 |Cell 4 |param_2/param_1

所需输出:

|param_1|param_2|calc 
|-------|-------|--------
|Cell 1 |Cell 2 |Cell 1-Cell 2
|Cell 3 |Cell 4 |Cell 4/Cell 3

在calc列中,默认值是一个公式。它可以像上面提供的一样简单,也可以是"2 *(param_8-param_4)/param_2-(param_3/param_7)"。我需要的是用名称相关列中的值替换所有param_x。
我尝试了很多方法,但是都不起作用,大多数时候,当我使用replace或regex_replace来替换值的列时,会出现列不可迭代的错误。
此外,列param_1、param_2、...、param_x是动态生成的,并且计算列值可以是这些列中的一些列,但不必是所有列。
你能用一个动态的解决方案来帮助我吗?
太感谢你了。最好的问候

wr98u20j

wr98u20j1#

    • 更新:**原来我误解了要求。这将工作:
for exp in ["regexp_replace(calc, '"+col+"', "+col+")" for col in df.schema.names]:
   df=df.withColumn("calc", F.expr(exp))

输入/输出:

  • ------以下部分暂时保留,仅供参考------
    你不能直接这么做-因为你不能直接使用列值,除非你在python对象中收集(显然不推荐)。
    这将适用于相同的情况:
df = spark.createDataFrame([["1","2", "param_1 - param_2"],["3","4", "2*param_1 + param_2"]]).toDF("param_1", "param_2", "calc");

    df.show()

    df=df.withColumn("row_num", F.row_number().over(Window.orderBy(F.lit("dummy"))))

    as_dict = {row.asDict()["row_num"]:row.asDict()["calc"] for row in df.select("row_num", "calc").collect()}

    expression = f"""CASE {' '.join([f"WHEN row_num ='{k}' THEN ({v})" for k,v in as_dict.items()])} \
            ELSE NULL END""";

    df.withColumn("Result", F.expr(expression)).show();

输入/输出:

相关问题