回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有两个数组列(<code>names</code>,<code>score</code>)。我要把它们都炸掉。将名称作为得分的<code>name</code>列(类似于pivot)</p>
<pre><code>+------------+-------------------------+--------------------+
| id | names | score |
+------------+-------------------------+--------------------+
|ab01 |[F1 , F2, F3, F4, F5] |[00123, 000.001, 00127, 00.0123, 111]
|ab02 |[F1 , F2, F3, F4, F5, F6]|[00124, 000.003, 00156, 00.067, 156, 254]
|ab03 |[F1 , F2, F3, F4, F5] |[00234, 000.078, 00188, 00.0144, 188]
|ab04 |[F1 , F2, F3, F4, F5] |[00345, 000.01112, 001567, 00.0186, 555]
</code></pre>
<p>预期产出:</p>
<pre><code> id F1 F2 F3 F4 F5 F6
ab01 00123 000.001 00127 00.0123 111 null
ab02 00124 000.003 00156 00.067 156 254
ab03 00234 000.078 00188 00.0144 188 null
ab04 00345 000.01112 001567 00.0186 555 null
</code></pre>
<p>我试着把名字和分数拉上拉链,然后把它们炸开</p>
<pre><code>combine = F.udf(lambda x, y: list(zip(x, y)),
ArrayType(
StructType(
[StructField("names", StringType()),
StructField("score", StringType())
]
)
)
)
df2 = df.withColumn("new", combine("score", "names"))
.withColumn("new", F.explode("new"))
.select("id",
F.col("new.names").alias("names"),
F.col("new.score").alias("score")
)
</code></pre>
<p>我得到一个错误:</p>
<blockquote>
<p>TypeError: zip argument #1 must support iteration</p>
</blockquote>
<p>我还尝试使用rdd <code>flatMap()</code>进行爆炸,但仍然得到相同的错误</p>
<p>有没有其他方法可以实现这一点</p>