6

データフレームdfVectorUDT列がfeaturesとなっています。どのようにして最初の要素のように、列の要素を取得できますか?Spark DataFrameのVectorUDT列の要素にアクセスする方法は?

私は、次の

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

答えて

5

変換出力:

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オブジェクトに再直列化する必要があります。標準のPythonスカラを返す

v.values.item(0) 

:あなたは(SparseVectorsの用心)valuesにアクセスしたい場合は、itemメソッドを使用する必要があります。同様に、密な構造としてすべての値にアクセスする場合は、

v.toArray().tolist() 
+0

これは私のためには機能しませんでした。 – user2205916

+2

@ user2205916ここに再現可能な例があります。何が__働いていないかを説明するケア? :) – zero323

+1

私は 'lit(1)'を 'lit(0)'に変更するまで、これは私にとってはうまくいかなかった...あなたの再現可能な例から推測できる。ほんとありがと! –

関連する問題