web-dev-qa-db-fra.com

Couper la colonne de chaîne dans le cadre de données PySpark

Je suis débutant sur Python et Spark. Après avoir créé un DataFrame à partir de CSV fichier, je voudrais savoir comment je peux couper une colonne. I ' ve essayez:

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

df est mon bloc de données, Product est une colonne de ma table

Mais je vois toujours l'erreur:

Column object is not callable

Avez-vous des suggestions?

16
minh-hieu.pham

À partir de la version 1.5 , Spark SQL fournit deux fonctions spécifiques pour rogner les espaces blancs, ltrim et rtrim (recherchez "trim" dans la documentation DataFrame ); vous devrez importer pyspark.sql.functions première. Voici un exemple:

 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 ')]
12
desertnaut

La version pyspark de la fonction strip est appelée trim. Trim "coupe les espaces des deux extrémités pour la colonne de chaîne spécifiée". Veillez à importer la fonction en premier et à placer la colonne que vous ajustez à l'intérieur de votre fonction.

Les éléments suivants devraient fonctionner:

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

df = df.withColumn("Product", trim(col("Product")))
8
novice

J'ai fait ça avec l'UDF comme ça:

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'))

la sortie ressemble à ceci:

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

+----------+----------+
|        d1|        d2|
+----------+----------+
|2015-04-08|2015-05-10|
+----------+----------+
5
Babu