Ich habe einen Datenrahmen ( business_df
) des Schemas:
|-- business_id: string (nullable = true)
|-- categories: array (nullable = true)
| |-- element: string (containsNull = true)
|-- city: string (nullable = true)
|-- full_address: string (nullable = true)
|-- hours: struct (nullable = true)
|-- name: string (nullable = true)
Ich möchte einen neuen Datenrahmen ( new_df
) erstellen, damit die Werte in der 'name'
Spalte keine Leerzeichen enthalten.
Mein Code lautet:
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql import HiveContext
from pyspark.sql.functions import UserDefinedFunction
from pyspark.sql.types import StringType
udf = UserDefinedFunction(lambda x: x.replace(' ', ''), StringType())
new_df = business_df.select(*[udf(column).alias(name) if column == name else column for column in business_df.columns])
new_df.registerTempTable("vegas")
new_df.printSchema()
vegas_business = sqlContext.sql("SELECT stars, name from vegas limit 10").collect()
Ich erhalte immer wieder diesen Fehler:
NameError: global name 'replace' is not defined
Was ist los mit diesem Code?
Während das von Ihnen beschriebene Problem mit dem bereitgestellten Code nicht reproduzierbar ist, ist die Verwendung von Python UDFs
zur Ausführung einfacher Aufgaben wie dieser eher ineffizient. Wenn Sie einfach Leerzeichen aus dem Text entfernen möchten, verwenden Sie regexp_replace
:
from pyspark.sql.functions import regexp_replace, col
df = sc.parallelize([
(1, "foo bar"), (2, "foobar "), (3, " ")
]).toDF(["k", "v"])
df.select(regexp_replace(col("v"), " ", ""))
Wenn Sie leere Zeilen normalisieren möchten, verwenden Sie trim
:
from pyspark.sql.functions import trim
df.select(trim(col("v")))
Wenn Sie führende / nachfolgende Leerzeichen behalten möchten, können Sie Folgendes anpassen regexp_replace
:
df.select(regexp_replace(col("v"), "^\s+$", ""))
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen