如何检查列数据 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 上的一列地图