1

데이터의 주어진 열 (이 경우 문자열)을 변환하여 숫자로 변환하는 방법을 찾고 있습니다. 예를 들어, 내가 값을 문자열 dataframe 있습니다Pyspark Dataframe - 문자열을 숫자로 매핑

+------------+ 
| level | 
+------------+ 
|  Medium| 
|  Medium| 
|  Medium| 
|  High| 
|  Medium| 
|  Medium| 
|   Low| 
|   Low| 
|  High| 
|   Low| 
|   Low| 

을 그리고이 값으로 변환되는 곳 나는 새 열을 만들려면 :

"High"= 1, "Medium" = 2, "Low" = 3 

+------------+ 
| level_num| 
+------------+ 
|   2| 
|   2| 
|   2| 
|   1| 
|   2| 
|   2| 
|   3| 
|   3| 
|   1| 
|   3| 
|   3| 

내가 함수를 정의하려고했습니다 다음과 같이 데이터 프레임에 대해 foreach를 수행합니다.

def f(x): 
    if(x == 'Medium'): 
     return 2 
    elif(x == "Low"): 
     return 3 
    else: 
     return 1 

a = df.select("level").rdd.foreach(f) 

그러나이 값은 "없음"유형을 반환합니다. 생각? 언제나처럼 도와 줘서 고마워!

답변

2

시도한 행을 따라 확실히 수행 할 수 있습니다. foreach 대신 map 연산이 필요합니다.

spark.version 
# u'2.2.0' 

from pyspark.sql import Row 
# toy data: 
df = spark.createDataFrame([Row("Medium"), 
           Row("High"), 
           Row("High"), 
           Row("Low") 
          ], 
           ["level"]) 
df.show() 
# +------+ 
# | level| 
# +------+ 
# |Medium| 
# | High| 
# | High| 
# | Low| 
# +------+ 

이 장난감 데이터와 f(x)를 사용하여, 우리는 얻을 :

df.select("level").rdd.map(lambda x: f(x[0])).collect() 
# [2, 1, 1, 3] 

그리고 하나 더 map 당신에게 dataframe 줄 것이다 :

df.select("level").rdd.map(lambda x: f(x[0])).map(lambda x: Row(x)).toDF(["level_num"]).show() 
# +---------+ 
# |level_num| 
# +---------+ 
# |  2| 
# |  1| 
# |  1| 
# |  3| 
# +---------+ 

을하지만 것이 바람직 할 것 임시 중간 RDD를 호출하지 않고 데이터 프레임 기능 when 대신에 사용 귀하의 f(x) :

from pyspark.sql.functions import col, when 

df.withColumn("level_num", when(col("level")=='Medium', 2).when(col("level")=='Low', 3).otherwise(1)).show() 
# +------+---------+ 
# | level|level_num| 
# +------+---------+ 
# |Medium|  2| 
# | High|  1| 
# | High|  1| 
# | Low|  3| 
# +------+---------+