【问题标题】:How to typecast Spark DataFrame columns? Using pyspark [duplicate]如何对 Spark DataFrame 列进行类型转换?使用 pyspark [重复]
【发布时间】:2019-03-23 02:49:24
【问题描述】:

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

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

df = spark.read.csv("train.csv", header=True)

我的 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)

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

我知道我可以在调用 csv() 时指定架构选项,但我想在稍后阶段更改数据类型。

某些列有缺失值。 Spark DataFrames 如何处理缺失值?

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    你也可以试试这个-

    df1 = df.select(df.column1.cast("float"), df.column2.cast("integer"))
    

    【讨论】:

      【解决方案2】:

      要更改数据类型,您可以例如执行cast。例如,考虑iris 数据集,其中SepalLengthCmint 类型的列。如果您想将该 int 转换为字符串,可以执行以下操作:

      df.withColumn('SepalLengthCm',df['SepalLengthCm'].cast('string'))
      

      当然,在您的情况下,您可以从stringint 执行相反的操作。您也可以使用不同的语法访问列:

      df.withColumn('SepalLengthCm',df.SepalLengthCm.cast('string'))
      

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

      df.withColumn('SepalLengthCm',col('SepalLengthCm').cast('string'))
      

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

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

      • 如何——“任何”或“全部”。如果为“any”,则删除一行,如果它包含任何空值。如果为“all”,则仅当其所有值为 null 时才删除一行。
      • thresh – int,默认值 None 如果指定,删除具有小于 thresh 非空值的行。这会覆盖 how 参数。
      • 子集 - 要考虑的列名的可选列表。

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

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

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

      【讨论】:

      • 谢谢安德里亚。我仍然不明白为什么很难找到这个答案。
      猜你喜欢
      • 1970-01-01
      • 2018-07-24
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多