2016-12-21 33 views
4

我對Spark很新穎,目前正在使用R API通過Sparkly包使用它。我從配置單元查詢中創建了一個Spark數據框。數據類型未在源表中正確指定,我試圖通過利用dplyr包中的函數來重置數據類型。以下是我試過的代碼:將列數據類型更改爲sparklyr的因子

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數據幀所需的更改?

回答

3

一般來說,您可以使用標準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 

問題是火花不提供řfactor的任何直接等同。

在Spark SQL中,我們使用double類型和列元數據來表示分類變量,而ML Transformers(它們不是SQL的一部分)用於編碼。因此factor/as.factor沒有地方。 SparkR在使用ML時提供了一些自動轉換,但我不確定sparklyr(我知道的最接近的是ml_create_dummy_variables)是否有類似的機制。