【问题标题】:Trim string column in PySpark dataframe修剪 PySpark 数据框中的字符串列
【发布时间】:2016-05-11 09:31:35
【问题描述】:

从 CSV 文件创建 Spark DataFrame 后,我想修剪一列。我试过了:

df = df.withColumn("Product", df.Product.strip())

df 是我的数据框,Product 是我表中的一列

但我得到了错误:

Column object is not callable

有什么建议吗?

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql trim


    【解决方案1】:
    from pyspark.sql.functions import trim
    
    df = df.withColumn("Product", trim(col("Product")))
    

    【讨论】:

    • 这与this answer below基本相同,4个月前已经发布(也有一些解释)。
    【解决方案2】:

    1.5版本开始,Spark SQL提供了两个特定的修剪空白函数ltrimrtrim(在DataFrame documentation中搜索“trim”);您需要先导入pyspark.sql.functions。这是一个例子:

     from pyspark.sql import SQLContext
     from pyspark.sql.functions import *
     sqlContext = SQLContext(sc)
    
     df = sqlContext.createDataFrame([(' 2015-04-08 ',' 2015-05-10 ')], ['d1', 'd2']) # create a dataframe - notice the extra whitespaces in the date strings
     df.collect()
     # [Row(d1=u' 2015-04-08 ', d2=u' 2015-05-10 ')]
     df = df.withColumn('d1', ltrim(df.d1)) # trim left whitespace from column d1
     df.collect()
     # [Row(d1=u'2015-04-08 ', d2=u' 2015-05-10 ')]
     df = df.withColumn('d1', rtrim(df.d1))  # trim right whitespace from d1
     df.collect()
     # [Row(d1=u'2015-04-08', d2=u' 2015-05-10 ')]
    

    【讨论】:

    • 不幸的是,Spark 的 trim() 函数不会修剪空白,而只会修剪空格。使用 issues.apache.org/jira/browse/SPARK-17299 更改了此行为。要同时修剪诸如“\t、\n”等空白,需要一个正则表达式。
    【解决方案3】:

    strip函数的pyspark版本称为trim;会的

    将指定字符串列两端的空格剪掉。

    确保首先导入函数并将要修剪的列放入函数中。

    以下应该有效:

    from pyspark.sql.functions import trim
    df = df.withColumn("Product", trim(df.Product))
    

    【讨论】:

      【解决方案4】:

      我是这样用 udf 做的:

      from pyspark.sql.functions import udf
      
      def trim(string):
          return string.strip()
      trim=udf(trim)
      
      df = sqlContext.createDataFrame([(' 2015-04-08 ',' 2015-05-10 ')], ['d1', 'd2'])
      
      df2 = df.select(trim(df['d1']).alias('d1'),trim(df['d2']).alias('d2'))
      

      输出如下所示:

      df.show()
      df2.show()
      +------------+------------+
      |          d1|          d2|
      +------------+------------+
      | 2015-04-08 | 2015-05-10 |
      +------------+------------+
      
      +----------+----------+
      |        d1|        d2|
      +----------+----------+
      |2015-04-08|2015-05-10|
      +----------+----------+
      

      【讨论】:

        【解决方案5】:

        如果您需要对数据框中的所有列执行此操作。

        from pyspark.sql import functions as f
        
        for colname in df.columns:
            df = df.withColumn(colname, f.trim(f.col(colname)))
        

        【讨论】:

          猜你喜欢
          • 2018-01-06
          • 1970-01-01
          • 1970-01-01
          • 2022-06-14
          • 2017-04-18
          • 2016-08-30
          • 2019-12-28
          • 2016-07-07
          • 2019-07-15
          相关资源
          最近更新 更多