<p>如果要将输出与Spark ML一起使用,最好使用<code>CountVectorizer</code>:</p>
<pre><code>from pyspark.ml.feature import CountVectorizer
# Add binary=True if needed
df_enc = (CountVectorizer(inputCol="name", outputCol="name_vector")
.fit(df)
.transform(df))
df_enc.show(truncate=False)
</code></pre>
^{pr2}$
<p>否则收集不同的值:</p>
<pre><code>from pyspark.sql.functions import array_contains, col, explode
names = [
x[0] for x in
df.select(explode("name").alias("name")).distinct().orderBy("name").collect()]
</code></pre>
<p>并使用<code>array_contains</code>选择列:</p>
<pre><code>df_sep = df.select("*", *[
array_contains("name", name).alias("name_{}".format(name)).cast("integer")
for name in names]
)
df_sep.show()
</code></pre>
<pre class="lang-none prettyprint-override"><code>+ -+ -+ + + + +
| name| id|name_a|name_b|name_c|name_d|
+ -+ -+ + + + +
|[a, b, c]| 1| 1| 1| 1| 0|
| [a, c]| 2| 1| 0| 1| 0|
| [d]| 3| 0| 0| 0| 1|
| [b, c]| 4| 0| 1| 1| 0|
|[a, b, d]| 5| 1| 1| 0| 1|
+ -+ -+ + + + +
</code></pre>