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


99

文字列として列を持つデータフレームがあります。PySparkで列タイプをDoubleタイプに変更したいと思いました。

以下は私がやった方法です:

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

知りたいだけですが、これはロジスティック回帰を実行しているときにエラーが発生するので正しい方法ですか?これが問題の原因です。

回答:


167

ここでは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>'

2
col関数の使用も機能します。from pyspark.sql.functions import colchangedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza

cast()引数の可能な値は何ですか( "string"構文)?
Wirawan Purwanto

Spark docがデータ型の有効な文字列にどの程度簡潔であったかは信じられません。私が見つけた最も近い参照はこれでした:docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/…
Wirawan Purwanto

1
複数の列を一度に変換する方法は?
hui chen

nullableをfalseに変更するにはどうすればよいですか?
pitchblack408

48

列の名前を保持し、入力列と同じ名前を使用して余分な列を追加しないようにします。

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

3
元の列名を保持する方法を探していたおかげでありがとう
javadba

Sparkが識別する短い文字列データタイプのどこかにリストがありますか?
alfredox 2017

1
このソリューションは、ループ内でも見事に機能します。例from pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
ケツァルコアトル

10

与えられた答えは問題に対処するのに十分ですが、私はSparkの新しいバージョンを導入する可能性がある別の方法を共有したいので(私はそれについてはわかりません)、与えられた答えはそれをキャッチしませんでした。

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

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

5

pysparkバージョン:

  df = <source data>
  df.printSchema()

  from pyspark.sql.types import *

  # Change column type
  df_new = df.withColumn("myColumn", df["myColumn"].cast(IntegerType()))
  df_new.printSchema()
  df_new.select("myColumn").show()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.