2016-07-18 3 views
4

내 데이터는 다음과 같습니다어떻게 열 데이터 스파크 스칼라에 IsEmpty 함수를 확인하는

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

가 어떻게이 COL3이 불꽃 SQL 쿼리에 비어있는 경우 확인합니까? 나는 폭발하려고했지만, 그렇게하면 빈 배열 행이 사라집니다. 어떤 사람들은 저에게 이것을 할 수있는 방법을 제안 할 수 있습니까?

는 I 시도 :

subscriptionProvider(WrappedArray()) 컬럼 값의 어레이를 갖는 그러나 어떤 배열이 비어있을 수있다
val homeSet = result.withColumn("subscriptionProvider", explode($"subscriptionProvider")) 

. 나는 널 (null) 값으로 SubscriptionProvider가 얻을 필요 SubscriptionProvider가 배열은 "컴캐스트"

답변

6

시도가 있습니다

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")) 
+0

감사합니다. 그것은 작동합니다. 그러나 효율적으로 2 열을 작성 df.withColumn – Swetha

+0

할 때 시도했다 : tmp.filter ($ "subscriptionProvider"=== "null"). collect.foreach (println) 작동하지 않는다 – Swetha

+0

tmp.filter ($ "requestId"=== "223433"). select ($ "subscriptionProvider"). collect.foreach (println)는 [null]을 제공하지만 tmp.filter ($ "subscriptionProvider"=== "null")를 쿼리 할 때 collect .foreach (println) 그게 아무것도 보이지 않는다. – Swetha

3

LostInOverflow의 대답은 dataframe의 사고 방식에두고 좋은입니다. 그러나 그것은 size의 효율성 여부에 따라리스트의 크기에 달려 있습니다. 큰 목록이있는 경우 데이터 프레임으로 빠져 나와 데이터 프레임으로 되돌아가는 것이 가장 좋습니다.

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

나는 생각을했지만, : val records = sqlContext.read.schema (schema) .json (filePath) val dfSchema = records.schema val filtered = records.rdd.filter ($ "requestId"=== "223433"). collect.foreach (println)이 함수는 나에게 다음을 제공한다. getRecords() 오류 – Swetha

+0

java.lang.ClassCastException : ja va.lang.String은 scala.collection.Seq에 캐스팅 될 수 없습니다. – Swetha

+0

@Swetha 0을 열의 서수 위치로 바꿔야합니다. 귀하의 요청에 맞는 답변을 편집했습니다. –