我有一个带有2个向量列的pyspark嵌套框架。当我在笔记本中显示嵌套框架时,它会像这样打印每个向量:{“vectorType”:“sparse”,“length”:262144,“indices”:[21641],“values”:[1]}当我打印模式时,它显示为VectorUDT。我只需要“values”字段值作为列表或数组。我如何保存它作为一个新字段?执行“vector_field”.values似乎不起作用,因为pyspark认为它是一个String.
vsdwdz231#
spark有一个内置的ml函数用于向量到数组的转换-vector_to_array。你可以简单地传递向量列来获得与1D数组相同的结果。这里有一个例子
vector_to_array
from pyspark.ml.linalg import SparseVector, DenseVectorimport pyspark.ml.functions as mfuncdata_ls = [ (SparseVector(3, [(0, 1.0), (2, 2.0)]),), (DenseVector([3.0, 0.0, 1.0]),), (SparseVector(3, [(1, 4.0)]),)]spark.createDataFrame(data_ls, ['vec']). \ withColumn('arr', mfunc.vector_to_array('vec')). \ show(truncate=False)# +-------------------+---------------+# |vec |arr |# +-------------------+---------------+# |(3,[0,2],[1.0,2.0])|[1.0, 0.0, 2.0]|# |[3.0,0.0,1.0] |[3.0, 0.0, 1.0]|# |(3,[1],[4.0]) |[0.0, 4.0, 0.0]|# +-------------------+---------------+# root# |-- vec: vector (nullable = true)# |-- arr: array (nullable = false)# | |-- element: double (containsNull = false)
from pyspark.ml.linalg import SparseVector, DenseVector
import pyspark.ml.functions as mfunc
data_ls = [
(SparseVector(3, [(0, 1.0), (2, 2.0)]),),
(DenseVector([3.0, 0.0, 1.0]),),
(SparseVector(3, [(1, 4.0)]),)
]
spark.createDataFrame(data_ls, ['vec']). \
withColumn('arr', mfunc.vector_to_array('vec')). \
show(truncate=False)
# +-------------------+---------------+
# |vec |arr |
# |(3,[0,2],[1.0,2.0])|[1.0, 0.0, 2.0]|
# |[3.0,0.0,1.0] |[3.0, 0.0, 1.0]|
# |(3,[1],[4.0]) |[0.0, 4.0, 0.0]|
# root
# |-- vec: vector (nullable = true)
# |-- arr: array (nullable = false)
# | |-- element: double (containsNull = false)
字符串
kqhtkvqz2#
我尝试使用以下向量值:
smpl_data = [(SparseVector(3, {0: 1.0, 2: 2.0}),), (DenseVector([3.0, 0.0, 1.0]),), (SparseVector(3, {1: 4.0}),)]dilip_df = spark.createDataFrame(data, ["vector_field"])dilip_df.printSchema()dilip_df.show()
smpl_data = [(SparseVector(3, {0: 1.0, 2: 2.0}),),
(SparseVector(3, {1: 4.0}),)]
dilip_df = spark.createDataFrame(data, ["vector_field"])
dilip_df.printSchema()
dilip_df.show()
的数据我定义了一个函数,这个函数以一个vector为输入,它会检查这个vector是SparseVector还是DenseVector,如果是SparseVector,它会使用vector.values.tolist()将值转换成一个列表,如果是DenseVector,它也会使用vector.values.tolist()将值转换成一个列表,如果这个vector既不是SparseVector也不是DenseVector,它返回None。使用.withColumn创建新列values_listPySpark的udf函数用于将extract_values函数注册为UDF。UDF被分配给变量extract_values_udf。udf函数的第二个参数指定UDF的返回类型,这表明UDF返回一个双精度值数组。
vector.values.tolist()
.withColumn
extract_values
def extract_values(vector): if isinstance(vector, SparseVector): return vector.values.tolist() elif isinstance(vector, DenseVector): return vector.values.tolist() else: return Noneextract_values_udf = udf(extract_values, ArrayType(DoubleType()))dilip_df = dilip_df.withColumn("values_list", extract_values_udf("vector_field"))dilip_df.show(truncate=False)
def extract_values(vector):
if isinstance(vector, SparseVector):
return vector.values.tolist()
elif isinstance(vector, DenseVector):
else:
return None
extract_values_udf = udf(extract_values, ArrayType(DoubleType()))
dilip_df = dilip_df.withColumn("values_list", extract_values_udf("vector_field"))
dilip_df.show(truncate=False)
+-------------------+---------------+|vector_field |values_list |+-------------------+---------------+|(3,[0,2],[1.0,2.0])|[1.0, 2.0] ||[3.0,0.0,1.0] |[3.0, 0.0, 1.0]||(3,[1],[4.0]) |[4.0] |+-------------------+---------------+
+-------------------+---------------+
|vector_field |values_list |
|(3,[0,2],[1.0,2.0])|[1.0, 2.0] |
|[3.0,0.0,1.0] |[3.0, 0.0, 1.0]|
|(3,[1],[4.0]) |[4.0] |
的数据
2条答案
按热度按时间vsdwdz231#
spark有一个内置的ml函数用于向量到数组的转换-
vector_to_array
。你可以简单地传递向量列来获得与1D数组相同的结果。这里有一个例子
字符串
kqhtkvqz2#
我尝试使用以下向量值:
字符串
的数据
我定义了一个函数,这个函数以一个vector为输入,它会检查这个vector是SparseVector还是DenseVector,如果是SparseVector,它会使用
vector.values.tolist()
将值转换成一个列表,如果是DenseVector,它也会使用vector.values.tolist()
将值转换成一个列表,如果这个vector既不是SparseVector也不是DenseVector,它返回None。使用.withColumn
创建新列values_listPySpark的udf函数用于将extract_values
函数注册为UDF。UDF被分配给变量extract_values_udf。udf函数的第二个参数指定UDF的返回类型,这表明UDF返回一个双精度值数组。的数据