pyspark에서 Dataframe 열을 String 유형에서 Double 유형으로 변경하는 방법


99

열이 문자열 인 데이터 프레임이 있습니다. PySpark에서 열 유형을 Double 유형으로 변경하고 싶었습니다.

다음은 방법입니다.

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

로지스틱 회귀 분석을 실행하는 동안 오류가 발생하므로 이것이 문제의 원인인지 궁금합니다.

답변:


171

여기에는 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 col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza

cast () 인수 ( "문자열"구문)의 가능한 값은 무엇입니까?
Wirawan Purwanto 2018

Spark 문서가 데이터 유형에 대한 유효한 문자열에 얼마나 간결했는지 믿을 수 없습니다. 내가 찾을 수있는 가장 가까운 참조는 docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… 입니다.
Wirawan Purwanto 2018

1
한 번에 여러 열을 변환하는 방법은 무엇입니까?
hui chen 19

nullable을 false로 변경하려면 어떻게합니까?
pitchblack408

50

열 이름을 유지하고 입력 열과 동일한 이름을 사용하여 추가 열 추가를 방지합니다.

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

3
감사합니다. 원래 열 이름을 유지하는 방법을 찾고있었습니다
javadba

Spark가 식별 할 짧은 문자열 데이터 유형 목록이 있습니까?
alfredox

1
이 솔루션은 루프에서도 훌륭하게 작동합니다. 예from pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl

11

주어진 대답은 문제를 처리하기에 충분하지만 새 버전의 Spark를 도입 할 수있는 다른 방법을 공유하고 싶습니다 (확실하지 않습니다) 하지 않습니다 그래서 주어진 대답은 그것을 잡지 못했습니다.

spark 문에서 col("colum_name")키워드로 열에 도달 할 수 있습니다 .

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()

2

해결책은 간단했습니다.

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.