python apache-spark pyspark apache-spark-sql

python - Explotar en PySpark



apache-spark apache-spark-sql (2)

Para dividir en espacios en blanco y también eliminar líneas en blanco, agregue la cláusula where .

DF = sqlContext.createDataFrame([(''cat /n/n elephant rat /n rat cat/nmat/n'', )], [''word'']) >>> (DF.select(explode(split(DF.word, "/s")).alias("word")) .where(''word != ""'') .show()) +--------+ | word| +--------+ | cat| |elephant| | rat| | rat| | cat| | mat| +--------+

Me gustaría transformar de un DataFrame que contiene listas de palabras en un DataFrame con cada palabra en su propia fila.

¿Cómo exploto en una columna en un DataFrame?

Aquí hay un ejemplo con algunos de mis intentos en los que puede descomentar cada línea de código y obtener el error que se detalla en el siguiente comentario. Yo uso PySpark en Python 2.7 con Spark 1.6.1.

from pyspark.sql.functions import split, explode DF = sqlContext.createDataFrame([(''cat /n/n elephant rat /n rat cat'', )], [''word'']) print ''Dataset:'' DF.show() print ''/n/n Trying to do explode: /n'' DFsplit_explode = ( DF .select(split(DF[''word''], '' '')) # .select(explode(DF[''word''])) # AnalysisException: u"cannot resolve ''explode(word)'' due to data type mismatch: input to function explode should be array or map type, not StringType;" # .map(explode) # AttributeError: ''PipelinedRDD'' object has no attribute ''show'' # .explode() # AttributeError: ''DataFrame'' object has no attribute ''explode'' ).show() # Trying without split print ''/n/n Only explode: /n'' DFsplit_explode = ( DF .select(explode(DF[''word''])) # AnalysisException: u"cannot resolve ''explode(word)'' due to data type mismatch: input to function explode should be array or map type, not StringType;" ).show()

Por favor aconséjame


explode y split son funciones SQL. Ambos operan en la Column SQL. split toma una expresión regular de Java como segundo argumento. Si desea separar datos en espacios en blanco arbitrarios, necesitará algo como esto:

df = sqlContext.createDataFrame( [(''cat /n/n elephant rat /n rat cat'', )], [''word''] ) df.select(explode(split(col("word"), "/s+")).alias("word")).show() ## +--------+ ## | word| ## +--------+ ## | cat| ## |elephant| ## | rat| ## | rat| ## | cat| ## +--------+