Spark Dataframe在转换后选择列

时间:2018-04-14 18:29:18

标签: python apache-spark pyspark apache-spark-sql user-defined-functions

我正在检查DF中6列中的2列的NULL值。但是当我应用内置函数并使用select时,结果DF没有剩余的列。有没有更好的方法可以不使用UDF。

handle_null_cols = [ 'col1', 'col3' ]

# df_null = df.select([ myFunc(col_name).alias(col_name) for col_name in df.columns ])
df_null = df.select( [ myFunc(col_name).alias(col_name) for col_name in handle_null_cols ])

df_null.printSchema() # Resultant DF has only 2 columns selected

col1:int
col3:int

需要重复使用相同的DF df_null,以便在df之前的所有列的下游进行更多转换。

2 个答案:

答案 0 :(得分:2)

你为什么不做这样的事?

df.select([
    myFunc(col_name).alias(col_name) if col_name in handle_null_cols
    else col_name
    for col_name in df.columns
])

reduce + withColumn是更加神秘但可行的解决方案:

from functools import reduce

reduce(
    lambda df, col_name: df.withColumn(col_name, myFunc(col_name)), 
    handle_null_cols,
    df)

但听起来有点像你真正想要na个功能:

df.na.fill(0, subset=handle_null_cols)

答案 1 :(得分:0)

我想我是基于@ user9613318的见解而弄明白的。 更轻松的眼睛。而且效率也很高?

handle_null_cols = [ 'col1', 'col3' ]

df_null = ( df.select(*[myFunc(col).alias(col) 
if col in handle_null_cols else col for col in df.columns]))