topandas examples drop crear column python sql apache-spark dataframe pyspark

python - drop - pyspark sql examples



Filtrado de un Pyspark DataFrame con cláusula IN similar a SQL (4)

Cadena que pasa a SQLContext se evaluó en el ámbito del entorno SQL. No captura el cierre. Si desea pasar una variable, tendrá que hacerlo explícitamente utilizando el formato de cadena:

df = sc.parallelize([(1, "foo"), (2, "x"), (3, "bar")]).toDF(("k", "v")) df.registerTempTable("df") sqlContext.sql("SELECT * FROM df WHERE v IN {0}".format(("foo", "bar"))).count() ## 2

Obviamente, esto no es algo que usaría en un entorno SQL "real" debido a consideraciones de seguridad, pero no debería importar aquí.

En la práctica, DataFrame DSL es una gran opción cuando desea crear consultas dinámicas:

from pyspark.sql.functions import col df.where(col("v").isin({"foo", "bar"})).count() ## 2

Es fácil de construir y componer y maneja todos los detalles de HiveQL / Spark SQL por usted.

Quiero filtrar un Pyspark DataFrame con una cláusula IN similar a SQL, como en

sc = SparkContext() sqlc = SQLContext(sc) df = sqlc.sql(''SELECT * from my_df WHERE field1 IN a'')

donde a es la tupla (1, 2, 3) . Estoy recibiendo este error:

java.lang.RuntimeException: [1.67] error: `` ('''' esperado pero identificador a encontrado

que básicamente dice que esperaba algo como ''(1, 2, 3)'' en lugar de a. El problema es que no puedo escribir manualmente los valores en un archivo extraído de otro trabajo.

¿Cómo filtraría en este caso?


Solo una pequeña adición / actualización:

choice_list = ["foo", "bar", "jack", "joan"]

Si desea filtrar el marco de datos "df", de modo que desee mantener las filas basadas en una columna "v" tomando solo los valores de choice_list, entonces

df_filtered = df.where( ( col("v").isin (choice_list) ) )


Un enfoque ligeramente diferente que funcionó para mí es filtrar con una función de filtro personalizada.

def filter_func(a): """wrapper function to pass a in udf""" def filter_func_(col): """filtering function""" if col in a.value: return True return False return udf(filter_func_, BooleanType()) # Broadcasting allows to pass large variables efficiently a = sc.broadcast((1, 2, 3)) df = my_df.filter(filter_func(a)(col(''field1''))) /


reiterando lo que @ zero323 ha mencionado anteriormente: podemos hacer lo mismo usando una lista también (no solo la set ) como abajo

from pyspark.sql.functions import col df.where(col("v").isin(["foo", "bar"])).count()