【发布时间】:2016-04-03 23:08:31
【问题描述】:
我有许多 PySpark 数据框,其中两列中的数据是必需的,而其他列是可选的。必填列包含日期和记录 ID;最有价值的数据位于可选列中。我正在尝试捕获可选列中元素之间的联系。
数据框,预过滤器:
id col1 col2 col3 date
123 xyz 20160401
234 abc pqr 20160401
345 def hij klm 20160401
456 20160401
过滤后,数据框将如下所示:
id col1 col2 col3 date
234 abc pqr 20160401
345 def hij klm 20160401
具有多个非空列值的记录很有趣,因为它们描述了关系。
我注意到 PySpark 有一个 .filter 方法。文档中的示例通常显示过滤列,例如df_filtered = df.filter(df.some_col > some_value)。我正在尝试编写一个过滤器来捕获具有四个或更多非空列的所有记录,用于 arbitrary 数据帧,即不得明确说明列名。
在 PySpark 中是否有一种简单的方法可以做到这一点?
更新
虽然.dropna(thresh=4) 似乎正是我正在寻找的东西,但由于某种原因它不起作用。例如
df.collect()
[Row(id=123, col1=None, col2=None, col3=3754907743, date='20160403'),
Row(id=124, col1=7911019393, col2=None, col3=1456473867, date='20160403'),
Row(id=125, col1=None, col2=None, col3=2049622472, date='20160403'),
Row(id=126, col1=4345043212, col2=None, col3=3168577324, date='20160403'),
Row(id=127, col1=None, col2=None, col3=3185277065, date='20160403'),
Row(id=128, col1=1336048242, col2=None, col3=1322345860, date='20160403')]
不管thresh是多少,它总是返回原始数据框中的所有记录:
df_filtered = df.dropna(thresh=[any number])
df_filtered.collect()
[Row(id=123, col1=None, col2=None, col3=3754907743, date='20160403'),
Row(id=124, col1=7911019393, col2=None, col3=1456473867, date='20160403'),
Row(id=125, col1=None, col2=None, col3=2049622472, date='20160403'),
Row(id=126, col1=4345043212, col2=None, col3=3168577324, date='20160403'),
Row(id=127, col1=None, col2=None, col3=3185277065, date='20160403'),
Row(id=128, col1=1336048242, col2=None, col3=1322345860, date='20160403')]
我正在运行 Spark 版本 1.5.0-cdh5.5.2。
【问题讨论】: