¿Cómo podemos encontrar la cantidad de palabras en una columna de un marco de datos de chispa sin usar la función REEMPLAZAR () de SQL? A continuación se muestra el código y la entrada con la que estoy trabajando, pero la función replace () no funciona.
from pyspark.sql import SparkSession my_spark = SparkSession \ .builder \ .appName("Python Spark SQL example") \ .enableHiveSupport() \ .getOrCreate() parqFileName = 'gs://caserta-pyspark-eval/train.pqt' tuesdayDF = my_spark.read.parquet(parqFileName) tuesdayDF.createOrReplaceTempView("parquetFile") tuesdaycrimes = spark.sql("SELECT LENGTH(Address) - LENGTH(REPLACE(Address, ' ', ''))+1 FROM parquetFile") print(tuesdaycrimes.show()) +-------------------+--------------+--------------------+---------+----------+--------------+--------------------+-----------+---------+ | Dates| Category| Descript|DayOfWeek|PdDistrict| Resolution| Address| X| Y| +-------------------+--------------+--------------------+---------+----------+--------------+--------------------+-----------+---------+ |2015-05-14 03:53:00| WARRANTS| WARRANT ARREST|Wednesday| NORTHERN|ARREST, BOOKED| OAK ST / LAGUNA ST| -122.42589|37.774597| |2015-05-14 03:53:00|OTHER OFFENSES|TRAFFIC VIOLATION...|Wednesday| NORTHERN|ARREST, BOOKED| OAK ST / LAGUNA ST| -122.42589|37.774597| |2015-05-14 03:33:00|OTHER OFFENSES|TRAFFIC VIOLATION...|Wednesday| NORTHERN|ARREST, BOOKED|VANNESS AV / GREE...| -122.42436|37.800415|Hay varias formas de contar las palabras usando las funciones de pyspark DataFrame, según lo que esté buscando.
Crear datos de ejemplo
import pyspark.sql.functions as f data = [ ("2015-05-14 03:53:00", "WARRANT ARREST"), ("2015-05-14 03:53:00", "TRAFFIC VIOLATION"), ("2015-05-14 03:33:00", "TRAFFIC VIOLATION") ] df = sqlCtx.createDataFrame(data, ["Dates", "Description"]) df.show() En este ejemplo, contaremos las palabras en la columna Description .
Contar en cada fila
Si desea el recuento de palabras en la columna especificada para cada fila, puede crear una nueva columna usando withColumn() y hacer lo siguiente:
pyspark.sql.functions.split() para dividir la cadena en una listapyspark.sql.functions.size() para contar la longitud de la listaPor ejemplo:
df = df.withColumn('wordCount', f.size(f.split(f.col('Description'), ' '))) df.show() #+-------------------+-----------------+---------+ #| Dates| Description|wordCount| #+-------------------+-----------------+---------+ #|2015-05-14 03:53:00| WARRANT ARREST| 2| #|2015-05-14 03:53:00|TRAFFIC VIOLATION| 2| #|2015-05-14 03:33:00|TRAFFIC VIOLATION| 2| #+-------------------+-----------------+---------+Suma el recuento de palabras en todas las filas
Si desea contar el número total de palabras en la columna en todo el DataFrame, puede usar pyspark.sql.functions.sum() :
df.select(f.sum('wordCount')).collect() #[Row(sum(wordCount)=6)]Contar la ocurrencia de cada palabra
Si desea el recuento de cada palabra en todo el DataFrame, puede usar split() y pyspark.sql.function.explode() seguido de groupBy y count() .
df.withColumn('word', f.explode(f.split(f.col('Description'), ' ')))\ .groupBy('word')\ .count()\ .sort('count', ascending=False)\ .show() #+---------+-----+ #| word|count| #+---------+-----+ #| TRAFFIC| 2| #|VIOLATION| 2| #| WARRANT| 1| #| ARREST| 1| #+---------+-----+Puede hacerlo simplemente usando split y el size de las funciones de la API de pyspark (a continuación se muestra un ejemplo): -
sqlContext.createDataFrame([['this is a sample address'],['another address']])\ .select(F.size(F.split(F.col("_1"), " "))).show() Below is Output:- +------------------+ |size(split(_1, ))| +------------------+ | 5| | 2| +------------------+Puede definir una función udf como
def splitAndCountUdf(x): return len(x.split(" ")) from pyspark.sql import functions as F countWords = F.udf(splitAndCountUdf, 'int') y llámelo usando la función .withColumn como
tuesdayDF.withColumn("wordCount", countWords(tuesdayDF.address)) Y si desea un recuento distinto de palabras, puede cambiar la función udf para incluir el set como
def splitAndCountUdf(x): return len(set(x.split(" "))) from pyspark.sql import functions as F countWords = F.udf(splitAndCountUdf, 'int')