Skip to main content
 首页 » 编程设计

python之PySpark:访问 sql 中的向量元素

2024年09月07日31itcoder

我有一个 spark 数据框,它有一个名为 features 的列,其中包含数据向量。此列是 pyspark 的 StandardScaler 对象的输出。我在这里创建了一个类似于我拥有的数据集。

# create sample data 
arr = [[1,2,3], [4,5,6]] 
df_example = spark.createDataFrame(arr, ['A','B','C']) 
assembler = VectorAssembler(inputCols=[x for x in df_example.columns],outputCol='features') 
df_vector = assembler.transform(df_example).select('features') 
 
 
>>> df_vector.show() 
+-------------+ 
|     features| 
+-------------+ 
|[1.0,2.0,3.0]| 
|[4.0,5.0,6.0]| 
+-------------+ 

我想找到每个向量与特定聚类中心(相同长度的数组)之间的欧氏距离。假设聚类中心为:

cluster_center_0 = np.array([0.6, 0.7, 0.8]) 

我如何实现这一点?我尝试创建一个 SQL 查询,希望我可以使用 OFFSET 访问向量中的元素,然后从那里很容易计算距离。但那没有成功。这是我使用的查询。不幸的是它不起作用,而且我对 sql 的了解非常有限

SELECT aml_cluster_inpt_features 
aml_cluster_inpt_features[OFFSET(0)] AS offset_0, 
aml_cluster_inpt_features[OFFSET(1)] AS offset_1, 
aml_cluster_inpt_features[OFFSET(2)] AS offset_2, 
aml_cluster_inpt_features[OFFSET(3)] AS offset_3, 
FROM event_rate_holder 

有更简单的方法吗?如果不是,我使用上面的 sql 查询是否朝着正确的方向前进?

请您参考如下方法:

只需使用 UDF:

from pyspark.sql.functions import udf 
from scipy.spatial import distance 
 
def euclidean(v1): 
    @udf("double") 
    def _(v2): 
        return distance.euclidean(v1, v2) if v2 is not None else None 
    return _ 
 
 
center = np.array([0.6, 0.7, 0.8]) 
 
df_vector.withColumn("dist", euclidean(center)("features")).show() 
# +-------------+-----------------+ 
# |     features|             dist| 
# +-------------+-----------------+ 
# |[1.0,2.0,3.0]|2.586503431275513| 
# |[4.0,5.0,6.0]|7.555792479945437| 
# +-------------+-----------------+ 

如果你想反汇编向量,你可以使用 How to split Vector into columns - using PySpark