使用sparklyr将列数据类型更改为因子。

7

我对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数据框架上使用它似乎无法产生正确的结果:

> 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数据框进行所需的更改?

1个回答

6

通常,您可以使用标准的 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)。请注意,HTML标签将被保留。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接