【问题标题】:How to handle null entries in SparkR如何处理 SparkR 中的空条目
【发布时间】:2015-10-14 10:08:44
【问题描述】:

我有一个 SparkSQL 数据帧。

此数据中的某些条目是空的,但它们的行为不像 NULL 或 NA。我怎样才能删除它们?有任何想法吗?

在 R 中,我可以轻松删除它们,但在 sparkR 中,它说 S4 系统/方法存在问题。

谢谢。

【问题讨论】:

    标签: r apache-spark sparkr apache-spark-1.4


    【解决方案1】:

    SparkR 列提供long list of useful methods,包括isNullisNotNull

    > people_local <- data.frame(Id=1:4, Age=c(21, 18, 30, NA))
    > people <- createDataFrame(sqlContext, people_local)
    > head(people)
    
      Id Age
    1  1  21
    2  2  18
    3  3  NA
    
    > filter(people, isNotNull(people$Age)) %>% head()
      Id Age
    1  1  21
    2  2  18
    3  3  30
    
    > filter(people, isNull(people$Age)) %>% head()
      Id Age
    1  4  NA
    

    请记住,在 SparkR 中 NANaN 之间没有区别。

    如果您更喜欢对整个数据框进行操作,则有一组 NA functions,包括 fillnadropna

    > fillna(people, 99) %>% head()
     Id Age
    1  1  21
    2  2  18
    3  3  30
    4  4  99
    
    > dropna(people) %>% head()
     Id Age
    1  1  21
    2  2  18
    3  3  30
    

    两者都可以调整为仅考虑某些列子集 (cols),并且dropna 有一些额外的有用参数。例如,您可以指定最少的非空列数:

    > people_with_names_local <- data.frame(
        Id=1:4, Age=c(21, 18, 30, NA), Name=c("Alice", NA, "Bob", NA))
    > people_with_names <- createDataFrame(sqlContext, people_with_names_local)
    > people_with_names %>% head()
      Id Age  Name
    1  1  21 Alice
    2  2  18  <NA>
    3  3  30   Bob
    4  4  NA  <NA>
    
    > dropna(people_with_names, minNonNulls=2) %>% head()
      Id Age  Name
    1  1  21 Alice
    2  2  18  <NA>
    3  3  30   Bob
    

    【讨论】:

      【解决方案2】:

      这不是最好的解决方法,但如果您将它们转换为字符串,它们将存储为“NaN”,然后您可以过滤它们,一个简短的示例:

      testFrame   <- createDataFrame(sqlContext, data.frame(a=c(1,2,3),b=c(1,NA,3)))
      testFrame$c <- cast(testFrame$b,"string")
      
      resultFrame <- collect(filter(testFrame, testFrame$c!="NaN"))
      resultFrame$c <- NULL
      

      这将省略 b 列中缺少元素的整行。

      【讨论】:

      • 它需要针对不同类型的单独代码,并且会因布尔值而完全失败:df &lt;- createDataFrame(sqlContext, data.frame(x=c(FALSE, NA, TRUE))); df$chx &lt;- cast(df$x,"string"); df %&gt;% head()
      • 那么问题是条目是空的。让我举个例子:ID = 1 2 3. AGE = 21 EMPTY 20. 所以这个数据中的第 2 个是空的,但在 sparkR 中它没有“值”NAN、NA 或 NULL。这个想法可能是给这个空条目一个值?
      • 你能举一个初始化的例子吗?只是为了了解您是否有 data.frame(ID=c(1,2,3),AGE=c(21,"EMPTY",20)) 或 data.frame(ID=c(1,2,3), AGE=c(21,,20)) 或其他。
      • 我有一个来自 csv 文件的数据集。我称之为'pgz'。当我在 sparkR 中输入 pgz 时,我得到“DataFrame[id:string, age:string]”作为输出。让我们看一下第一个数据。 ID = 1 2 3. 假设 ID=1 的 AGE 为 21,ID=3 的 AGE 为 20。 ID=2 的 AGE 为空。当我将对数据运行函数时,这给我在 sparkR 中带来了问题。示例:获取每个 ID 的 AGE 并将其加 1。这适用于 ID=1 和 ID=3,但它会在 ID=2 时崩溃,因为此 ID 为空。所以我想删除这个ID。
      猜你喜欢
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多