擅长:python、mysql、java
<p>解决方案是:</p>
<pre><code>udf_func = udf(func, StringType())
for col_name in spark_df.columns:
spark_df = spark_df.withColumn(col_name, udf_func(lit(col_name), col_name))
return spark_df.toPandas()
</code></pre>
<p>有3个关键见解帮助我解决了这个问题:</p>
<ol>
<li>如果将<code>withColumn</code>与现有列的名称(<code>col_name</code>)一起使用,则Spark“overwrites”/会隐藏原始列。这本质上给人一种直接编辑列的感觉,就好像它是可变的一样。在</li>
<li>通过在原始列之间创建一个循环并重用相同的DataFrame变量<code>spark_df</code>,我使用相同的原理来模拟一个可变的数据帧,创建一个列级转换链,每次“重写”一个列(每个#1-见下文)</li>
<li>Spark<code>UDFs</code>希望所有参数都是<code>Column</code>类型,这意味着它尝试解析每个参数的列值。因为<code>api_function</code>的第一个参数是一个对于向量中所有行都相同的文本值,所以必须使用<code>lit()</code>函数。只要将col_name传递给函数,就会尝试提取该列的列值。据我所知,传递<code>col_name</code>等同于传递{<cd9>}。在</li>
</ol>
<p>假设有3列“a”、“b”和“c”,展开此概念如下所示:</p>
^{pr2}$