如何转换Spark DataFrame列?使用pyspark

pow*_*wer 0 apache-spark pyspark

我已经通过以下方式创建了一个DataFrame:

from pyspark.sql import SparkSession
spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .getOrCreate()

df = spark.read.csv("train.csv", header=True)
Run Code Online (Sandbox Code Playgroud)

我的DataFrame的架构如下:

root
 |-- PassengerId: string (nullable = true)
 |-- Survived: string (nullable = true)
 |-- Pclass: string (nullable = true)
 |-- Name: string (nullable = true)
 |-- Sex: string (nullable = true)
 |-- Age: string (nullable = true)
 |-- SibSp: string (nullable = true)
 |-- Parch: string (nullable = true)
 |-- Ticket: string (nullable = true)
 |-- Fare: string (nullable = true)
 |-- Cabin: string (nullable = true)
 |-- Embarked: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

如何更改DataFrame每列的数据类型?

我知道我可以在对csv()的调用中指定schema选项,但是我想稍后再更改数据类型。

一些列缺少值。Spark DataFrames如何处理缺失值?

And*_*rea 5

要更改数据类型,您可以例如执行cast。例如,考虑iris数据集where SepalLengthCm是type的列int。如果要将该int强制转换为字符串,则可以执行以下操作:

df.withColumn('SepalLengthCm',df['SepalLengthCm'].cast('string'))
Run Code Online (Sandbox Code Playgroud)

当然,根据情况,您可以从a string到an 相反int。您也可以使用其他语法访问列:

df.withColumn('SepalLengthCm',df.SepalLengthCm.cast('string'))
Run Code Online (Sandbox Code Playgroud)

或者,from pyspark.sql.functions import col您可以导入(无需直接处理df):

df.withColumn('SepalLengthCm',col('SepalLengthCm').cast('string'))
Run Code Online (Sandbox Code Playgroud)

您可以使用df.na.drop(how='any', thresh=None, subset=None)(或df.dropna())处理空值。这是文档页面,您可以在其中检查参数的含义。

返回一个新的DataFrame,省略具有空值的行。DataFrame.dropna()和DataFrameNaFunctions.drop()是彼此的别名。参数:

  • 方式-“任何”或“全部”。如果为“ any”,则在其中包含任何null的情况下删除一行。如果为“ all”,则仅当其所有值均为null时才删除一行。
  • thresh – int,默认值无如果指定,则删除小于thresh非空值的行。这将覆盖how参数。
  • 子集–要考虑的可选列名称列表。

如果遇到空值,也可以选择分配一个特定值。这次您应该使用df.na.fill(value, subset=None)(或df.fillna())。这是文档页面

替换空值,na.fill()的别名。DataFrame.fillna()和DataFrameNaFunctions.fill()是彼此的别名。参数:

  • 值– int,long,float,string或dict。用于替换空值的值。如果该值为dict,则将忽略子集,并且该值必须是从列名(字符串)到替换值的映射。替换值必须是int,long,float,boolean或string。
  • 子集–要考虑的可选列名称列表。子集中指定的不具有匹配数据类型的列将被忽略。例如,如果value是一个字符串,并且子集包含一个非字符串列,则该非字符串列将被忽略。