转换后 Spark Dataframe 选择列

Posted

技术标签:

【中文标题】转换后 Spark Dataframe 选择列【英文标题】:Spark Dataframe Select Columns After Transformation 【发布时间】:2018-04-14 18:29:17 【问题描述】:

我正在检查我的 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 中的所有列进行更多下游转换。

【问题讨论】:

【参考方案1】:

你为什么不做这样的事情?

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)

【讨论】:

【参考方案2】:

我想我是根据@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]))

【讨论】:

好的。已经完成了。

以上是关于转换后 Spark Dataframe 选择列的主要内容,如果未能解决你的问题,请参考以下文章

在 RDD 转换上保留 Spark DataFrame 列分区

使用 Spark Dataframe scala 将多个不同的列转换为 Map 列

PySpark:Spark Dataframe - 将 ImageSchema 列转换为 nDArray 作为新列

带有替代方法的重载方法值选择

如何将 Spark Dataframe 列转换为字符串数组的单列

使用 Scala 将多列转换为 Spark Dataframe 上的一列地图