Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark:在sql中访问向量元素_Python_Apache Spark_Pyspark_K Means - Fatal编程技术网

Python PySpark:在sql中访问向量元素

Python PySpark:在sql中访问向量元素,python,apache-spark,pyspark,k-means,Python,Apache Spark,Pyspark,K Means,我有一个spark dataframe,它有一个名为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 d

我有一个spark dataframe,它有一个名为
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|
# +-------------+-----------------+

如果你想反汇编向量,你可以使用

谢谢你的回答。这个很好用。但是,有没有一种方法可以避免udf并仍然获得结果?我读到(并体验到)udf的效率不高,并且会减慢过程。我们每个数据集使用的数据量约为1000万条记录,并且有多个数据集,因此我不确定udf是否理想。向量没有本机实现,因此无法直接访问。这在将来可能会改变(尽管我不期望性能提高,只希望有更好的API)。