当前位置: 首页 > 知识库问答 >
问题:

将字符串列转换为向量列火花数据

邵修诚
2023-03-14

我有一个Spark dataframe,如下所示:

+-----------+-------------------+
|     ID    |     features      |
+-----------+-------------------+
|   18156431|(5,[0,1,4],[1,1,1])|
|   20260831|(5,[0,4,5],[2,1,1])|   
|   91859831|(5,[0,1],[1,3])    |
|  206186631|(5,[3,4,5],[1,5])  |
|  223134831|(5,[2,3,5],[1,1,1])|
+-----------+-------------------+

在此数据Frame中,features列是一个稀疏向量。在我的脚本,我必须保存这个DF文件在磁盘上。这样做时,features列被保存为文本列:示例“(5,[0,1,4],[1,1,1])”。如您所料,在Spark中再次导入时,该列将保持字符串。如何将列转换回(稀疏)向量格式?

共有1个答案

柳和怡
2023-03-14

由于UDF开销,效率不是特别高(最好使用保留类型的格式),但您可以这样做:

from pyspark.mllib.linalg import Vectors, VectorUDT
from pyspark.sql.functions import udf

df = sc.parallelize([
    (18156431, "(5,[0,1,4],[1,1,1])") 
]).toDF(["id", "features"])

parse = udf(lambda s: Vectors.parse(s), VectorUDT())
df.select(parse("features"))

请注意,它不能直接移植到2.0.0+和MLvector。由于ML向量不提供parse方法,因此必须解析为mllib并使用asml:

parse = udf(lambda s: Vectors.parse(s).asML(), VectorUDT())
 类似资料:
  • 问题内容: 如何将已作为字符串读取的列转换为数组列?即从下面的模式转换 至: 如果可能,请同时共享scala和python实现。在相关说明中,从文件本身读取时如何处理它?我有约450列的数据,我想以这种格式指定的列很少。目前,我正在pyspark中阅读以下内容: 谢谢。 问题答案: 有各种各样的方法, 最好的方法是使用函数并强制转换为 您也可以创建简单的udf来转换值 希望这可以帮助!

  • 问题内容: 我在pandas数据框中的某个列的类型有问题。基本上,该列以字符串形式保存在csv文件中,我想将其用作元组,以便能够将其转换为数字列表。接下来是一个非常简单的csv: 如果使用函数“ read_csv”加载它,则会得到字符串列表。我试图转换为列表,但是得到了字符串的列表版本: 返回: 关于如何做到这一点的任何想法吗? 谢谢。 问题答案: 您可以使用,这将给您一个元组: 如果确实需要列表

  • 问题内容: 我有一个pandas数据框。列之一包含一个列表。我希望该列为单个字符串。 例如,我的列表[‘one’,’two’,‘3’]应该简单地是‘1、2、3’ 给我[‘一个,两个,三个],[‘四个’,’五个’,’六个’],其中第二个列表来自下一行。不用说,对于数百万行,这种跨行连接不仅是不正确的,而且还会杀死我的内存。 问题答案: 在转换列表之前,您当然不应该转换为字符串。尝试: 另请注意,会将

  • 问题内容: 我有一个列表格式,如下所示: 如何转换为包含如下所示元素的列表: 问题答案: 用途: 或使用将其视为JSON : 以Python文字作为输入(因此Python源代码中的文本将为您提供一个值),以JSON输入。 演示: 只有当您的输入字符串中包含多个整数列表时,两者之间的区别才会发挥作用。JSON字符串包含unicode,在Python 2上无法正确解释,并且JSON类型只是支持的一部分

  • JavaScript具有 Java有这样的东西吗?我知道我可以用StringBuilder自己来添油加醋: ...但是如果类似的东西已经是JDK的一部分,那么这样做就没有意义了。