例如,我在name
中具有分类功能的DataFrame:
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local").appName("example")
.config("spark.some.config.option", "some-value").getOrCreate()
features = [(['a', 'b', 'c'], 1),
(['a', 'c'], 2),
(['d'], 3),
(['b', 'c'], 4),
(['a', 'b', 'd'], 5)]
df = spark.createDataFrame(features, ['name','id'])
df.show()
输出:
^{pr2}$我想要的是:
+--------+--------+--------+--------+----+
| name_a | name_b | name_c | name_d | id |
+--------+--------+--------+--------+----+
| 1 | 1 | 1 | 0 | 1 |
+--------+--------+--------+--------+----+
| 1 | 0 | 1 | 0 | 2 |
+--------+--------+--------+--------+----+
| 0 | 0 | 0 | 1 | 3 |
+--------+--------+--------+--------+----+
| 0 | 1 | 1 | 0 | 4 |
+--------+--------+--------+--------+----+
| 1 | 1 | 0 | 1 | 5 |
+--------+--------+--------+--------+----+
我找到了same queston,但没有任何帮助。
我试图从PySpark.ML
使用VectorIndexer
,但在将name
字段转换为vector type
时遇到了一些问题。在
from pyspark.ml.feature import VectorIndexer
indexer = VectorIndexer(inputCol="name", outputCol="indexed", maxCategories=5)
indexerModel = indexer.fit(df)
我得到以下错误:
Column name must be of type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 but was actually ArrayType
我找到了一个解决方案here,但看起来过于复杂。但是,我不确定是否只能用VectorIndexer
来完成。在
如果要将输出与Spark ML一起使用,最好使用
^{pr2}$CountVectorizer
:否则收集不同的值:
并使用
array_contains
选择列:使用来自} 的^{} :
pyspark.sql.functions
和^{按
^{pr2}$id
排序并将null
转换为0explode
为给定数组或映射中的每个元素返回新行。然后可以使用pivot
来“转置”新列。在相关问题 更多 >
编程相关推荐