根据列值有效地从宽 Spark Dataframe 中删除列

Posted

技术标签:

【中文标题】根据列值有效地从宽 Spark Dataframe 中删除列【英文标题】:Dropping columns from a wide Spark Dataframe efficiently based on column values 【发布时间】:2020-02-26 03:46:16 【问题描述】:

如果我有一个仅包含 IP 地址的宽数据帧(200m 列),并且我想删除包含空值或格式错误的 IP 地址的列,那么在 Spark 中执行此操作的最有效方法是什么?我的理解是 Spark 并行执行基于行的处理,而不是基于列的处理。因此,如果我尝试在列上应用转换,将会有很多改组。首先转置数据帧然后应用过滤器删除行,然后重新转置是利用 spark 并行性的好方法吗?

【问题讨论】:

200 M 列太多了。您最好的选择是对您的数据框进行采样(获取 10% 以便您的流程处理较少),然后同时在所有列上运行您的错误逻辑,删除坏列,循环通过迭代减少列数.如果你愿意,可以试试val inputDF = spark.sql(select "'AAA' as col1, 'AAAA' as col2") ; val commandStatement = Array["sum(if(length(col1),1,0)) as col1_check", "sum(if(length(col2),1,0)) as col2_check"]; val outputDF = inputDF.selectExpr(commandStatement:_*); ###DO SOME CHECK LOGIC### 这样的东西,我可以详细回答 通过执行布尔值后跟总和,您将获得每列的“坏”行总数。做一些百分位检查,如果它高于你的百分比失败标准,你可以删除该列。 【参考方案1】:

您可以使用结构 org.apache.spark.ml.linalg.SparseMatrix 以 CSC 格式存储矩阵

如果您可以过滤此数据类型并将其转换回您最好的数据帧

【讨论】:

以上是关于根据列值有效地从宽 Spark Dataframe 中删除列的主要内容,如果未能解决你的问题,请参考以下文章

使用列值作为 spark DataFrame 函数的参数

Spark DataFrame 按键将列值聚合到 List 中

从前一行和特定列值有效地更新熊猫数据框中的 NaN

当该行的一列值为 NULL 时,Spark Dataframe 为整行返回 NULL

R语言使用tidyr包的gather函数将dataframe从宽表转化为长表

R语言使用tidyr包的pivot_longer函数将dataframe从宽表转化为长表