【问题标题】: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")))
【解决方案2】:
从1.5版本开始,Spark SQL提供了两个特定的修剪空白函数ltrim和rtrim(在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 ')]
【解决方案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)))