单行上的字符串索引器、CountVectorizer Pyspark
String Indexer, CountVectorizer Pyspark on single row
您好,我遇到了一个问题,我的行包含两列单词数组。
column1, column2
["a", "b" ,"b", "c"], ["a","b", "x", "y"]
基本上我想计算列之间每个单词的出现次数以得到两个数组:
[1, 2, 1, 0, 0],
[1, 1, 0, 1, 1]
所以"a"在每个数组中出现一次,"b"在column1中出现两次,在column2中出现一次,"c"只在column1中出现,"x"和"y" 仅在 column2 中。依此类推。
我尝试查看 ml 库中的 CountVectorizer 函数,但不确定它是否适用于行,每列中的数组可能非常大?并且 0 值(一个词出现在一列中而不是另一列中)似乎没有被执行。
感谢任何帮助。
对于 Spark 2.4+,您可以使用 DataFrame API 和内置数组函数来做到这一点。
首先,使用 array_union
function. Then, use transform
function to transform the words array, where for each element calculate the number of occurences in each column using size
and array_remove
函数获取每一行的所有单词:
df = spark.createDataFrame([(["a", "b", "b", "c"], ["a", "b", "x", "y"])], ["column1", "column2"])
df.withColumn("words", array_union("column1", "column2")) \
.withColumn("occ_column1",
expr("transform(words, x -> size(column1) - size(array_remove(column1, x)))")) \
.withColumn("occ_column2",
expr("transform(words, x -> size(column2) - size(array_remove(column2, x)))")) \
.drop("words") \
.show(truncate=False)
输出:
+------------+------------+---------------+---------------+
|column1 |column2 |occ_column1 |occ_column2 |
+------------+------------+---------------+---------------+
|[a, b, b, c]|[a, b, x, y]|[1, 2, 1, 0, 0]|[1, 1, 0, 1, 1]|
+------------+------------+---------------+---------------+
您好,我遇到了一个问题,我的行包含两列单词数组。
column1, column2
["a", "b" ,"b", "c"], ["a","b", "x", "y"]
基本上我想计算列之间每个单词的出现次数以得到两个数组:
[1, 2, 1, 0, 0],
[1, 1, 0, 1, 1]
所以"a"在每个数组中出现一次,"b"在column1中出现两次,在column2中出现一次,"c"只在column1中出现,"x"和"y" 仅在 column2 中。依此类推。
我尝试查看 ml 库中的 CountVectorizer 函数,但不确定它是否适用于行,每列中的数组可能非常大?并且 0 值(一个词出现在一列中而不是另一列中)似乎没有被执行。
感谢任何帮助。
对于 Spark 2.4+,您可以使用 DataFrame API 和内置数组函数来做到这一点。
首先,使用 array_union
function. Then, use transform
function to transform the words array, where for each element calculate the number of occurences in each column using size
and array_remove
函数获取每一行的所有单词:
df = spark.createDataFrame([(["a", "b", "b", "c"], ["a", "b", "x", "y"])], ["column1", "column2"])
df.withColumn("words", array_union("column1", "column2")) \
.withColumn("occ_column1",
expr("transform(words, x -> size(column1) - size(array_remove(column1, x)))")) \
.withColumn("occ_column2",
expr("transform(words, x -> size(column2) - size(array_remove(column2, x)))")) \
.drop("words") \
.show(truncate=False)
输出:
+------------+------------+---------------+---------------+
|column1 |column2 |occ_column1 |occ_column2 |
+------------+------------+---------------+---------------+
|[a, b, b, c]|[a, b, x, y]|[1, 2, 1, 0, 0]|[1, 1, 0, 1, 1]|
+------------+------------+---------------+---------------+