【问题标题】:Transform string column to vector column Spark DataFrames将字符串列转换为向量列 Spark DataFrames
【发布时间】:2016-12-06 10:17:24
【问题描述】:

我有一个如下所示的 Spark 数据框:

+-----------+-------------------+
|     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])|
+-----------+-------------------+

在这个数据框中,特征列是一个稀疏向量。在我的脚本中,我必须将此 DF 作为文件保存在磁盘上。执行此操作时,功能列将另存为文本列:示例"(5,[0,1,4],[1,1,1])"。 如您所料,在 Spark 中再次导入时,该列仍为字符串。如何将列转换回(稀疏)矢量格式?

【问题讨论】:

  • 哪个版本的 Spark?你想得到哪个向量类(ML/MLib)?您如何读取这些数据?
  • Spark 版本 = 1.6.2。最好是 ML 向量(但您可以同时解释两者)。我使用以下代码读取数据:DF = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true', delimiter=delimiter).load('file://'+path).drop('')
  • 1.6 中没有 ML Vector,所以它让事情变得简单 :)
  • 它也可以是 MLLib 向量或任何其他类型的(稀疏)向量 :-)

标签: python pyspark apache-spark-sql apache-spark-mllib apache-spark-ml


【解决方案1】:

由于 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+ 和 ML Vector。由于 ML 向量不提供 parse 方法,您必须解析为 MLLib 并使用 asML

parse = udf(lambda s: Vectors.parse(s).asML(), VectorUDT())

【讨论】:

  • 能否请您提供一个在 python 和 Spark 2.0.2 中的 asML 示例代码?我应该将 asML 放在 udf 中吗?
猜你喜欢
  • 1970-01-01
  • 2017-11-25
  • 2018-04-17
  • 1970-01-01
  • 2022-01-17
  • 2016-04-10
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多