根据列值有效地从宽 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 按键将列值聚合到 List 中
当该行的一列值为 NULL 时,Spark Dataframe 为整行返回 NULL