如何检查列数据 Spark scala 上的 isEmpty

Posted

技术标签:

【中文标题】如何检查列数据 Spark scala 上的 isEmpty【英文标题】:How to check isEmpty on Column Data Spark scala 【发布时间】:2016-07-18 23:52:01 【问题描述】:

我的数据看起来像:

[null,223433,WrappedArray(),null,460036382,0,home,home,home]

如何在 spark sql 中检查 col3 是否为空?我试图爆炸,但是当我这样做时,空数组行正在消失。有人可以建议我一种方法来做到这一点。

我试过了:

val homeSet = result.withColumn("subscriptionProvider", explode($"subscriptionProvider"))

其中subscriptionProvider(WrappedArray()) 是具有值数组的列,但某些数组可以为空。我需要使用 null 值获取 subscriptionProvider,并且 subscriptionProvider 数组具有“Comcast”

【问题讨论】:

【参考方案1】:

试试:

import org.apache.spark.sql.functions._

val tmp = df.withColumn("subscriptionProvider", 
  when(size($"subscriptionProvider") !== 0, $"subscriptionProvider").otherwise(array(lit(null).cast("string"))))

tmp.withColumn("subscriptionProvider", explode($"subscriptionProvider"))

【讨论】:

谢谢。有用。但是创建 2 列 df.withColumn 是否有效 但是当我尝试使用: tmp.filter($"subscriptionProvider" === "null").collect.foreach(println) 它不起作用 tmp.filter($"requestId" === "223433").select($"subscriptionProvider").collect.foreach(println) 给出 [null] 但是当我查询 tmp.filter( $"subscriptionProvider" === "null").collect.foreach(println) 它什么也没显示【参考方案2】:

LostInOverflow 的回答有助于保持数据框的心态。但是,size 是否有效取决于列表的大小。如果您要拥有大型列表,那么最好退出并返回数据框:

val dfSchema = df.schema
val filtered = df.rdd.filter(!_.getList[String](2).isEmpty)
sqlContext.createDataFrame(filtered, dfSchema)

【讨论】:

我试过你的想法,但是: val records = sqlContext.read.schema(schema).json(filePath) val dfSchema = records.schema val filtered = records.rdd.filter(!_.getList [String](0).isEmpty) val newRecords = sqlContext.createDataFrame(filtered, dfSchema) newRecords.filter($"requestId" === "223433").collect.foreach(println) 它给了我错误 java.lang.ClassCastException: java.lang.String 不能转换为 scala.collection.Seq @Swetha 您必须将 0 替换为列的序号位置。我已根据您的要求编辑了答案

以上是关于如何检查列数据 Spark scala 上的 isEmpty的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark Scala 的 UDF 中将列作为值传递以检查条件

如何使用 Spark 数据框列上的函数或方法使用 Scala 进行转换

使用 Scala 将多列转换为 Spark Dataframe 上的一列地图

Spark:数据帧聚合(Scala)

在 spark 和 scala 中,如何将数据框转换或映射到特定列信息?

如何使用 Scala/Spark 添加不基于数据框中现有列的新列? [复制]