【问题标题】:Changing column data type to factor with sparklyr使用 sparklyr 将列数据类型更改为因子
【发布时间】:2017-05-06 08:47:36
【问题描述】:

我对 Spark 很陌生,目前正在通过 sparkly 包使用 R API 使用它。我从 hive 查询创建了一个 Spark 数据框。源表中未正确指定数据类型,我正在尝试通过利用 dplyr 包中的函数来重置数据类型。下面是我试过的代码:

prod_dev <- sdf_load_table(...)
num_var <-  c("var1", "var2"....)
cat_var <-  c("var_a","var_b", ...)

pos1 <- which(colnames(prod_dev) %in% num_var)
pos2 <- which(colnames(prod_dev) %in% cat_var)

prod_model_tbl <- prod_dev %>% 
                mutate(age = 2016- as.numeric(substr(dob_yyyymmdd,1,4))) %>%
                mutate(msa_fg = ifelse(is.na(msacode2000), 0, 1)) %>% 
                mutate(csa_fg = ifelse(is.na(csacode), 0, 1)) %>%
                mutate_each(funs(factor), pos2) %>%
                mutate_each(funs(as.numeric), pos1)

如果 prod_dev 是 R 数据帧,该代码将起作用。但是在 Spark Data 框架上使用它似乎不会产生正确的结果:

> head(prod_model_tbl)


    Source:   query [?? x 99]
    Database: spark connection master=yarn-client app=sparklyr_test local=FALSE

    Error: org.apache.spark.sql.AnalysisException: undefined function     FACTOR; line 97 pos 2248 at org.apache.spark.sql.hive.HiveFunctionRegistry....

有人可以建议如何对 Spark 数据框进行所需的更改吗?

【问题讨论】:

    标签: r apache-spark dplyr apache-spark-sql sparklyr


    【解决方案1】:

    一般来说,您可以使用标准的 R 泛型函数进行类型转换。例如:

    df <- data.frame(x=c(1, NA), y=c("-1", "2"))
    
    copy_to(sc, df, "df", overwrite=TRUE) %>% 
      mutate(x_char = as.character(x)) %>% 
      mutate(y_numeric = as.numeric(y))
    
    Source:   query [2 x 4]
    Database: spark connection master=...
    
          x     y x_char y_numeric
      <dbl> <chr>  <chr>     <dbl>
    1     1    -1    1.0        -1
    2   NaN     2   <NA>         2
    

    问题是 Spark 没有提供任何直接等效的 R factor

    在 Spark SQL 中,我们使用 double 类型和列元数据来表示分类变量和 ML Transformers,它们不是 SQL 的一部分,用于编码。因此,factor / as.factor 没有位置。 SparkR 在使用 ML 时提供了一些自动转换,但我不确定sparklyr 中是否有类似的机制(我知道的最接近的是ml_create_dummy_variables)。

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 2016-06-09
      • 2012-01-25
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多