【问题标题】:How to change multiple columns' types in pyspark?如何在 pyspark 中更改多个列的类型?
【发布时间】:2019-08-22 04:03:32
【问题描述】:

我只是在学习 pyspark。我想像这样更改列类型:

df1=df.select(df.Date.cast('double'),df.Time.cast('double'),
          df.NetValue.cast('double'),df.Units.cast('double'))

您可以看到 df 是一个数据框,我选择了 4 列并将它们全部更改为 double。由于使用了 select,所有其他列都将被忽略。

但是,如果 df 有数百列,我只需要更改这 4 列。我需要保留所有列。那么,该怎么做呢?

【问题讨论】:

    标签: python select types casting pyspark


    【解决方案1】:

    试试这个:

    from pyspark.sql.functions import col
    
    df = df.select([col(column).cast('double') for column in df.columns])
    

    【讨论】:

    • 这很好,但它不允许您像上面的答案那样更新 df
    • 说实话,不确定您是否正确,AFAIK Spark 数据帧是不可变的,因此无法就地更新。即使可以,我也看不出上面的解决方案如何就地更新任何东西。如果您有参考来支持您的陈述,我将有兴趣阅读。
    • 好吧,让我换个说法。我的意思不是像在 pandas 中那样你可以设置 in place 参数的地方。我的意思是它不允许我在一行中更新 df。一行总是更专业,尤其是与 for 循环相比。
    • 完全不懂。我的解决方案是 1 行,接受的答案为需要强制转换的每个 col 运行一个语句,即与您所说的直接相反
    • 实际上它确实返回了数据集的所有列(更新)。它没有做的是允许对列的子集进行差异处理,这是公认的答案所做的(并且可能是 OP 想要的)。再说一次,你的说法是不正确的。
    【解决方案2】:
    for c in df.columns:
        # add condition for the cols to be type cast
        df=df.withColumn(c, df[c].cast('double'))
    

    【讨论】:

    • @ags29 适用于小型数据集,我有 2K 列和大约 200K 记录。想要将除 3 列之外的所有内容都转换为整数。永远服用!有什么建议吗?
    【解决方案3】:

    使用selectExpr()的另一种方式:

    df1 = df.selectExpr("cast(Date as double) Date", 
        "cast(NetValueas string) NetValue")
    df1.printSchema()
    

    使用withColumn()

    from pyspark.sql.types import DoubleType, StringType
    
    df1 = df.withColumn("Date", df["Date"].cast(DoubleType())) \
          .withColumn("NetValueas ", df["NetValueas"].cast(StringType()))
    df1.printSchema()
    

    查看types 文档。

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 2019-01-02
      • 2015-11-23
      • 1970-01-01
      • 2018-01-31
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多