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

я есть датафрейм в 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()

мои данные выглядят так:

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

 neha26 окт. 2017 г., 15:59
Есть ли способ, с помощью которого только при чтении данных мы можем заменить nan, чтобы в схеме эти столбцы были обработаны как тип int.
 Chetan Vasudevan26 окт. 2017 г., 16:01
Я полагаю, что в вашем случае вам нужно будет сделать целое число целым числом.
 Chetan Vasudevan26 окт. 2017 г., 15:48

Ответы на вопрос(3)

Вы могли бы использоватьcast(как int) после заменыNaN с участием0,

data_df = df.withColumn("Plays", df.call_time.cast('float'))
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()))

но это самый простой способ преобразовать строковый столбец в целое число.

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

Пример:

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)

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

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

Ваш ответ на вопрос