J'ai dataframe dans pyspark. Certaines de ses colonnes numériques contiennent «nan». Par conséquent, lorsque je lis les données et que je vérifie le schéma du cadre de données, ces colonnes auront le type «chaîne». Comment puis-je les changer en int type.J'ai remplacé les valeurs 'nan' par 0 et vérifié à nouveau le schéma, mais il montre également le type de chaîne pour ces colonnes.
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()
ici, les colonnes 'Jeux' et 'Brouillons' contenant des valeurs entières, mais à cause de la présence de nan dans ces colonnes, elles sont traitées comme un type de chaîne.
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()))
Vous pouvez exécuter des boucles pour chaque colonne, mais c’est le moyen le plus simple de convertir une colonne de chaîne en entier.
Vous pouvez utiliser cast
(as int) après avoir remplacé NaN
par 0
,
data_df = df.withColumn("Plays", df.call_time.cast('float'))
Une autre façon de le faire consiste à utiliser le StructField si vous avez plusieurs champs à modifier.
Ex:
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)
Sortie:
Avant
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)
Après:
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)
La procédure est légèrement longue à lancer, mais l’avantage est que tous les champs requis peuvent être remplis.
Il est à noter que si le type de données est affecté aux champs obligatoires, la trame de données résultante ne contiendra que les champs modifiés.