web-dev-qa-db-ja.com

pysparkでDataframe列をString型からDouble型に変更する方法

Stringをカラムとするデータフレームがあります。 PySparkでカラムタイプをDoubleタイプに変更したいと思いました。

その方法は次のとおりです。

toDoublefunc = UserDefinedFunction(lambda x: x,DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))

ちょうど知りたい、ロジスティック回帰を実行中にこれを行うためのこれは正しい方法です、私はいくつかのエラーを得ているので、私は疑問に思う、これは問題の理由です。

64

ここではUDFは必要ありません。 Columnはすでに castメソッドDataTypeのインスタンスを提供します

from pyspark.sql.types import DoubleType

changedTypedf = joindf.withColumn("label", joindf["show"].cast(DoubleType()))

または短い文字列:

changedTypedf = joindf.withColumn("label", joindf["show"].cast("double"))

正規の文字列名(他のバリエーションもサポートできます)はsimpleStringの値に対応します。だから、原子型の場合:

from pyspark.sql import types 

for t in ['BinaryType', 'BooleanType', 'ByteType', 'DateType', 
          'DecimalType', 'DoubleType', 'FloatType', 'IntegerType', 
           'LongType', 'ShortType', 'StringType', 'TimestampType']:
    print(f"{t}: {getattr(types, t)().simpleString()}")
BinaryType: binary
BooleanType: boolean
ByteType: tinyint
DateType: date
DecimalType: decimal(10,0)
DoubleType: double
FloatType: float
IntegerType: int
LongType: bigint
ShortType: smallint
StringType: string
TimestampType: timestamp

そして例えば複合型

types.ArrayType(types.IntegerType()).simpleString()   
'array<int>'
types.MapType(types.StringType(), types.IntegerType()).simpleString()
'map<string,int>'
110
zero323

列の名前を保存し、入力列と同じ名前を使用して余分な列の追加を避けます。

changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
38
Duckling

与えられた答えは問題に対処するのに十分ですが、私はSparkの新しいバージョンを導入することができるかもしれない別の方法を共有したいです(私はそれについて確信できません)だから与えられた答えはそれを捕まえませんでした。

col("colum_name")キーワードを使用してsparkステートメントの列に到達できます。

from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))
4
serkan kucukbay

解決策は簡単でした -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
2