0

嗨,我遇到了一个问题,即我有两列单词数组的行。

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 值(其中一个单词出现在一个列中,但没有出现在另一列中)似乎没有得到贯彻。

任何帮助表示赞赏。

4

1 回答 1

1

对于 Spark 2.4+,您可以使用 DataFrame API 和内置数组函数来实现。

array_union首先,使用函数获取每一行的所有单词。然后,使用函数来转换单词数组,其中对于每个元素,使用和函数transform计算每列中出现的次数:sizearray_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]|
+------------+------------+---------------+---------------+
于 2020-02-07T21:27:14.660 回答