gpt4 book ai didi

apache-spark - 如何访问Spark DataFrame中VectorUDT列的元素?

转载 作者:行者123 更新时间:2023-12-03 14:06:05 26 4
gpt4 key购买 nike

我有一个数据框df和一个名为VectorUDTfeatures列。我如何获得列的元素,例如第一个元素?

我尝试了以下操作

from pyspark.sql.functions import udf
first_elem_udf = udf(lambda row: row.values[0])
df.select(first_elem_udf(df.features)).show()

但是我收到了 net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict(for numpy.dtype)错误。如果我改为 first_elem_udf = first_elem_udf(lambda row: row.toArray()[0]),则会发生相同的错误。

我也尝试了 explode(),但收到错误,因为它需要数组或映射类型。

我认为这应该是常见的操作。

最佳答案

将输出转换为float:

from pyspark.sql.types import DoubleType
from pyspark.sql.functions import lit, udf

def ith_(v, i):
try:
return float(v[i])
except ValueError:
return None

ith = udf(ith_, DoubleType())

用法示例:

from pyspark.ml.linalg import Vectors

df = sc.parallelize([
(1, Vectors.dense([1, 2, 3])),
(2, Vectors.sparse(3, [1], [9]))
]).toDF(["id", "features"])

df.select(ith("features", lit(1))).show()

## +-----------------+
## |ith_(features, 1)|
## +-----------------+
## | 2.0|
## | 9.0|
## +-----------------+

说明:

输出值必须重新序列化为等效的Java对象。如果要访问 values(谨防 SparseVectors),则应使用 item方法:

v.values.item(0)

返回标准的Python标量。同样,如果您想以密集结构访问所有值:
v.toArray().tolist()

关于apache-spark - 如何访问Spark DataFrame中VectorUDT列的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39555864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com