PySpark 在文本文件中读取为密集向量

Posted

技术标签:

【中文标题】PySpark 在文本文件中读取为密集向量【英文标题】:PySpark read in a textfile as Dense vectors 【发布时间】:2017-10-30 18:57:23 【问题描述】:

我正在使用 PySpark 并尝试加载以下格式的文件,其中每一行都是一个计数向量

[1394, 56692, 0, 10, 22]
[0, 0, 0, 0, 0]
[2235, 123, 678, 0, 999]

我正在尝试使用sc.textFile(path/to/counts.txt) 将其加载到 Spark 中。如何将文件的每一行转换为类似于以下格式的 pyspark ML 矢量?我假设它是一个 lambda 函数,但不确定如何将字符串转换为 ML Vector。

from pyspark.ml.linalg import Vectors as MLVectors
data = [(MLVectors.dense([0.0, 1.0, 0.0, 7.0, 0.0]),), 
(MLVectors.dense([2.0, 0.0, 3.0, 4.0, 5.0]),), (MLVectors.dense([4.0, 0.0, 
0.0, 6.0, 7.0]),)]

【问题讨论】:

您的文本文件中的数字实际上是否包含在[ ] 中,或者它们只是每行用逗号分隔的 5 个数字? 附在 [ ] 基本上,我可以将向量放入任何格式,但现在它们是那种格式。我遇到的问题是 sc.textfile 不像 Python 中的 readcsv 函数那么简单。 【参考方案1】:

您可以使用map 处理每一行

import re
from pyspark.ml.linalg import Vectors as MLVectors
rdd = sc.textFile("path/to/counts.txt")\
    .map(lambda l: MLVectors.dense([int(x) for x in (re.sub("[\[\]]", "", l).split(","))]))
rdd.take(3)

    [DenseVector([1394.0, 56692.0, 0.0, 10.0, 22.0]),
     DenseVector([0.0, 0.0, 0.0, 0.0, 0.0]),
     DenseVector([2235.0, 123.0, 678.0, 0.0, 999.0])]

数据框

import pyspark.sql.functions as psf
from pyspark.ml.feature import VectorAssembler
df = spark.read.csv("path/to/counts.txt")
df = df.select([psf.regexp_replace(c, '[\]\[]', '').cast("float").alias(c) for c in df.columns])
va = VectorAssembler(inputCols=df.columns, outputCol="vector")
df2 = va.transform(df)

【讨论】:

非常感谢,这回答了问题!我赞成该解决方案,但不幸的是,在它公开出现之前我需要更多的声誉。 我问这个问题的原因是创建一个类似于 df = sqlContext.createdataframe(data, "features") 的数据框,为此我需要添加一个额外的步骤并使用 toDF 函数,所以 rdd.map(lambda x: (x, )).toDF(["features"]) 然后可以将其加载到其他函数中。 如果您打算将其转换为数据框,您应该考虑像 csv 一样加载它并使用vectorAssembler。查看我的更新答案 希望对您有所帮助!不要忘记将您的问题标记为已解决:) 谢谢@desertnaut,感激不尽

以上是关于PySpark 在文本文件中读取为密集向量的主要内容,如果未能解决你的问题,请参考以下文章

通过 pyspark 中的 UDF 读取文本文件返回意外输出

使用 PySpark 从 Amazon S3 读取文本文件

从文本文件中读取整数并使用 C++ 将它们存储到向量中

C ++ - 将文本文件作为字符串读取,然后将字符串拆分为向量

从文本文件创建数据框,在 pyspark 中不起作用

python - 如何将密集向量的RDD转换为pyspark中的DataFrame?