Как преобразовать столбец со строковым типом в int form в рамке данных pyspark?

У меня есть датафрейм в pyspark. Некоторые из его числовых столбцов содержат 'nan', поэтому, когда я читаю данные и проверяю схему dataframe, эти столбцы будут иметь тип 'string'. Как я могу изменить их на тип int. Я заменил значения 'nan' на 0 и снова проверил схему, но затем также показал тип строки для этих столбцов. Я следую приведенному ниже коду:

data_df = sqlContext.read.format("csv").load('data.csv',header=True, inferSchema="true")
data_df.printSchema()
data_df = data_df.fillna(0)
data_df.printSchema()

мои данные выглядят так: enter image description here

здесь столбцы "Воспроизведение" и "черновики", содержащие целочисленные значения, но из-за того, что в этих столбцах присутствует nan, они рассматриваются как строковый тип.

Ответ 1

from pyspark.sql.types import IntegerType
data_df = data_df.withColumn("Plays", data_df["Plays"].cast(IntegerType()))
data_df = data_df.withColumn("drafts", data_df["drafts"].cast(IntegerType()))

Вы можете запустить цикл для каждого столбца, но это самый простой способ преобразования столбца строки в целое.

Ответ 2

Вы можете использовать cast (as int) после замены NaN на 0,

data_df = df.withColumn("Plays", df.call_time.cast('float'))

Ответ 3

Другой способ сделать это - использовать StructField, если у вас есть несколько полей, которые необходимо изменить.

Пример:

from pyspark.sql.types import StructField,IntegerType, StructType,StringType
newDF=[StructField('CLICK_FLG',IntegerType(),True),
       StructField('OPEN_FLG',IntegerType(),True),
       StructField('I1_GNDR_CODE',StringType(),True),
       StructField('TRW_INCOME_CD_V4',StringType(),True),
       StructField('ASIAN_CD',IntegerType(),True),
       StructField('I1_INDIV_HHLD_STATUS_CODE',IntegerType(),True)
       ]
finalStruct=StructType(fields=newDF)
df=spark.read.csv('ctor.csv',schema=finalStruct)

Выход:

До

root
 |-- CLICK_FLG: string (nullable = true)
 |-- OPEN_FLG: string (nullable = true)
 |-- I1_GNDR_CODE: string (nullable = true)
 |-- TRW_INCOME_CD_V4: string (nullable = true)
 |-- ASIAN_CD: integer (nullable = true)
 |-- I1_INDIV_HHLD_STATUS_CODE: string (nullable = true)

После:

root
 |-- CLICK_FLG: integer (nullable = true)
 |-- OPEN_FLG: integer (nullable = true)
 |-- I1_GNDR_CODE: string (nullable = true)
 |-- TRW_INCOME_CD_V4: string (nullable = true)
 |-- ASIAN_CD: integer (nullable = true)
 |-- I1_INDIV_HHLD_STATUS_CODE: integer (nullable = true)

Это немного длинная процедура, но преимущество состоит в том, что все необходимые поля могут быть заполнены.

Следует отметить, что если тип данных назначен только обязательным полям, то результирующий кадр данных будет содержать только те поля, которые были изменены.