如何保留 Spark HashingTF() 函数的输入键或索引?

how do I preserve the key or index of input to Spark HashingTF() function?

基于 1.4 的 Spark 文档 (https://spark.apache.org/docs/1.4.0/mllib-feature-extraction.html),我正在编写一个 TF-IDF 示例,用于将文本文档转换为值向量。给出的示例显示了如何完成此操作,但输入是一个没有键 的标记 的 RDD。这意味着我的输出 RDD 不再包含索引或键来引用原始文档。例子是这样的:

documents = sc.textFile("...").map(lambda line: line.split(" "))

hashingTF = HashingTF()
tf = hashingTF.transform(documents)

我想做这样的事情:

documents = sc.textFile("...").map(lambda line: (UNIQUE_LINE_KEY, line.split(" ")))

hashingTF = HashingTF()
tf = hashingTF.transform(documents)

并让生成的 tf 变量在某处包含 UNIQUE_LINE_KEY 值。我只是错过了一些明显的东西吗?从示例中可以看出,没有很好的方法来 link document RDD 和 tf RDD。

如果您使用提交 85b96372cf0fd055f89fc639f45c1f2cb02a378f 之后的 Spark 版本(包括 1.4),并使用 ml API HashingTF(需要 DataFrame 输入而不是普通 RDD),原始列在它的输出中。希望对您有所帮助!

我也遇到了同样的问题。在文档中的示例中,他们鼓励您直接在 RDD 上应用转换。

但是,您可以对向量本身应用转换,这样您就可以按照自己选择的方式保留密钥。

val input = sc.textFile("...")
val documents = input.map(doc => doc -> doc.split(" ").toSeq)

val hashingTF = new HashingTF()
val tf = documents.mapValues(hashingTF.transform(_))
tf.cache()
val idf = new IDF().fit(tf.values)
val tfidf = tf.mapValues(idf.transform(_))

请注意,此代码将生成 RDD[(String, Vector)] 而不是 RDD[Vector]