Mer*_*ozo 5 scala dataframe apache-spark apache-spark-sql
我想对我的数据进行一些预处理,我想删除稀疏的行(对于某个阈值).
例如,我有一个包含10个功能的数据帧表,我有一个8空值的行,然后我想删除它.
我发现了一些相关的主题,但我无法找到任何有用的信息.
stackoverflow.com/questions/3473778/count-number-of-nulls-in-a-row
上面的链接中的示例对我不起作用,因为我想自动执行此预处理.我不能写列名并做相应的事情.
那么无论如何在没有使用带有scala的Apache Spark中的列名来执行此删除操作?
令我惊讶的是,没有答案指出 Spark SQL 附带了很少的满足要求的标准函数:
例如,我有一个包含 10 个特征的数据框表,并且有一行包含 8 个空值,然后我想删除它。
您可以使用DataFrameNaFunctions.drop方法的变体之一并minNonNulls进行适当设置,例如 2。
drop(minNonNulls: Int, cols: Seq[String]): DataFrame返回一个新的 DataFrame,该 DataFrame 会删除指定列中包含少于 minNonNulls 非空和非 NaN 值的行。
并满足要求中列名称的可变性:
我无法编写列名称并执行相应操作。
您可以简单地使用Dataset.columns:
columns: Array[String]以数组形式返回所有列名称。
假设您有以下数据集,其中包含 5 个特征(列)和几行,几乎都是nulls。
val ns: String = null
val features = Seq(("0","1","2",ns,ns), (ns, ns, ns, ns, ns), (ns, "1", ns, "2", ns)).toDF
scala> features.show
+----+----+----+----+----+
| _1| _2| _3| _4| _5|
+----+----+----+----+----+
| 0| 1| 2|null|null|
|null|null|null|null|null|
|null| 1|null| 2|null|
+----+----+----+----+----+
// drop rows with more than (5 columns - 2) = 3 nulls
scala> features.na.drop(2, features.columns).show
+----+---+----+----+----+
| _1| _2| _3| _4| _5|
+----+---+----+----+----+
| 0| 1| 2|null|null|
|null| 1|null| 2|null|
+----+---+----+----+----+
Run Code Online (Sandbox Code Playgroud)
测试日期:
case class Document( a: String, b: String, c: String)
val df = sc.parallelize(Seq(new Document(null, null, null), new Document("a", null, null), new Document("a", "b", null), new Document("a", "b", "c"), new Document(null, null, "c"))).df
Run Code Online (Sandbox Code Playgroud)
带UDF
重新混合David的答案和下面我的 RDD 版本,您可以使用需要一行的 UDF 来完成此操作:
def nullFilter = udf((x:Row) => {Range(0, x.length).count(x.isNullAt(_)) < 2})
df.filter(nullFilter(struct(df.columns.map(df(_)) : _*))).show
Run Code Online (Sandbox Code Playgroud)
与RDD
您可以将其转换为 rdd,循环 Row 中的列并计算有多少列为空。
sqlContext.createDataFrame(df.rdd.filter( x=> Range(0, x.length).count(x.isNullAt(_)) < 2 ), df.schema).show
Run Code Online (Sandbox Code Playgroud)