2016-12-21 9 views
4

Sparkにはかなり新しく、現在はsparklyパッケージを通じてR APIを使用しています。私はハイブクエリからスパークデータフレームを作成しました。ソーステーブルでデータ型が正しく指定されていないため、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データフレームの場合、コードは動作します。しかし、スパークデータフレームにそれを使用して、正しい結果を生成していないようです:

> 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.... 

を誰かがスパークデータフレームに必要な変更を加える方法をアドバイスしてくださいことはできますか?

答えて

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 

問題はスパークR factorの任意の直接等価物を提供していませんです。

Spark SQLでは、カテゴリ変数を表すにはdouble型と列メタデータを使用し、エンコーディングにはSQLの一部ではないML Transformersを使用します。したがって、factor/as.factorの場所はありません。 SparkRはMLで作業するときに自動変換を提供しますが、sparklyr(私が気付いているもっとも近いものはml_create_dummy_variablesです)に同様のメカニズムがあるかどうかはわかりません。

関連する問題