Solución:
Acciones vs Transformaciones
- Recopilar (acción): devuelve todos los elementos del conjunto de datos como una matriz en el programa controlador. Esto suele ser útil después de un filtro u otra operación que devuelve un subconjunto suficientemente pequeño de datos.
Spark-sql doc
seleccionar (* cols) (transformación): proyecta un conjunto de expresiones y devuelve un nuevo DataFrame.
Parámetros: cols – lista de nombres de columna (cadena) o expresiones (columna). Si uno de los nombres de columna es ‘*’, esa columna se expande para incluir todas las columnas en el DataFrame actual. **
df.select('*').collect() [Row(age=2, name=u'Alice'), Row(age=5, name=u'Bob')] df.select('name', 'age').collect() [Row(name=u'Alice', age=2), Row(name=u'Bob', age=5)] df.select(df.name, (df.age + 10).alias('age')).collect() [Row(name=u'Alice', age=12), Row(name=u'Bob', age=15)]
Ejecución select(column-name1,column-name2,etc)
en un marco de datos, devuelve un nuevo marco de datos que contiene solo las columnas que se seleccionaron en el select()
función.
por ejemplo, asumiendo df
tiene varias columnas que incluyen “nombre” y “valor” y algunas otras.
df2 = df.select("name","value")
df2
contendrá solo dos columnas (“nombre” y “valor”) de todas las columnas de df
df2 como resultado de select
estará en los ejecutores y no en el controlador (como en el caso de usar collect()
)
guía-de-programación-sql
df.printSchema()
# root
# |-- age: long (nullable = true)
# |-- name: string (nullable = true)
# Select only the "name" column
df.select("name").show()
# +-------+
# | name|
# +-------+
# |Michael|
# | Andy|
# | Justin|
# +-------+
Puedes correr collect()
en un marco de datos (documentos de chispa)
>>> l = [('Alice', 1)]
>>> spark.createDataFrame(l).collect()
[Row(_1=u'Alice', _2=1)]
>>> spark.createDataFrame(l, ['name', 'age']).collect()
[Row(name=u'Alice', age=1)]
documentos de chispa
Para imprimir todos los elementos en el controlador, se puede usar el método collect () para llevar primero el RDD al nodo del controlador, así: rdd.collect (). Foreach (println). Sin embargo, esto puede hacer que el controlador se quede sin memoria, porque collect () recupera todo el RDD en una sola máquina; si solo necesita imprimir algunos elementos del RDD, un enfoque más seguro es usar take (): rdd.take (100) .foreach (println).
vocación select
El resultado es lazy
evaluación: por ejemplo:
val df1 = df.select("col1")
val df2 = df1.filter("col1 == 3")
ambas declaraciones anteriores crean una ruta perezosa que se ejecutará cuando llame a la acción en eso df
, tal como show
, collect
etc.
val df3 = df2.collect()
usar .explain
al final de su transformación para seguir su plan aquí hay información más detallada Transformaciones y Acciones
Select
se utiliza para proyectar algunos o todos los campos de un dataframe
. No te dará un value
como una salida pero una nueva dataframe
. Es un transformation
.