我必须在我的 Dataframe 中的所有列上实现下面的函数。但是使用for循环对spark性能有害,我如何避免使用for循环而仍然具有相同的逻辑和输出?我的函数接受一个 Dataframe ,并返回一个 Dataframe ,其中包含每个列的列名和所需的统计信息。
函数如下:
def get_null_count_and_percentage(df):
columnList = df.columns
total_count = df.count()
null_counts = []
for column_to_check in columnList:
null_count = df.filter(col(column_to_check).isNull()).count()
null_perentage = (null_count / total_count) * 100
null_counts.append((column_to_check, null_count, null_perentage))
result_df_count = (
spark.createDataFrame(null_counts, ["column_name", "null_counts", "null_percentage"])
.withColumn("null_percentage", round(col("null_percentage"), 3))
)
return result_df_count
字符串
我试着去找,但是找不到我的问题的确切解决方案。我试过map,reduce等,但是这些都不能解决这个问题。
2条答案
按热度按时间iih3973s1#
下面的代码将获得所有列的空计数
字符串
lsmepo6l2#
你可以把它简化成这样。首先计算你需要的任何stats并将其分配给struct(以避免重复的for循环)。然后使用
stack
将列转置为行,然后从struct中提取stats列。参见下面的例子:字符串