2017-03-10 19 views
1

ダミー変数に変換しています。元のカテゴリ変数をデータフレームから削除したい。私はsparklyrでそれをする方法を理解するために苦労しています。 dplyrでは直感的ですが、dplyr機能はsparklyrでは機能しません。例えばカラムデータタイプに基づいてスパークデータフレームを(スパークリーで)サブセット化する最良の方法は

スパークデータフレームを最初に作成します。

###create dummy data to figure out how model matrix formulas work in sparklyr 
v1 <- sample(LETTERS[1:4], 50000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05)) 
v2 <- sample(LETTERS[5:6], 50000, replace=TRUE, prob=c(0.7,0.3)) 
v3 <- sample(LETTERS[7:10], 50000, replace=TRUE, prob=c(0.3, 0.2, 0.4, 0.1)) 
v4 <- sample(LETTERS[11:15], 50000, replace=TRUE, prob=c(0.1, 0.1, 0.3, 0.05,.45)) 
v5 <- sample(LETTERS[16:17], 50000, replace=TRUE, prob=c(0.4,0.6)) 
v6 <- sample(LETTERS[18:21], 50000, replace=TRUE, prob=c(0.1, 0.1, 0.65, 0.15)) 
v7 <- sample(LETTERS[22:26], 50000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.03,.02)) 
v8 <- rnorm(n=50000,mean=.5,sd=.1) 
v9 <- rnorm(n=50000,mean=5,sd=3) 
v10 <- rnorm(n=50000,mean=3,sd=.5) 
response <- rnorm(n=50000,mean=10,sd=2) 

dat <- data.frame(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,response) 
write.csv(dat,file='fake_dat.csv',row.names = FALSE) 

#push "fake_dat" to the hdfs 

library(dplyr) 
library(sparklyr) 
#configure the spark session and connect 
config <- spark_config() 
config$`sparklyr.shell.driver-memory` <- "2G" #change depending on the size of the data 
config$`sparklyr.shell.executor-memory` <- "2G" 

# sc <- spark_connect(master='local', spark_home='/usr/hdp/2.5.0.0-1245/spark',config = config) 
# sc 

sc <- spark_connect(master='yarn-client', spark_home='/usr/hdp/2.5.0.0-1245/spark',config = config) 
sc 

#can also set spark_home as '/usr/hdp/current/spark-client' 

#read in the data from the hdfs 
df <- spark_read_csv(sc,name='fdat',path='hdfs://pnhadoop/user/stc004/fake_dat.csv') 

#create spark table 
dat <- tbl(sc,'fdat') 

は今ダミー変数を作成します。

for(i in 1:7){ 
    dat <- ml_create_dummy_variables(x=dat,colnames(dat)[i], reference = NULL) 
} 

私は単に

drop.cols <- colnames(dat)[1:7] 
dat1 <- 
    dat %>% 
    select(-one_of(drop.cols)) 
を使用して、元のカテゴリ変数をドロップすることができ

しかし、実際に作業しているデータには300のカテゴリ変数があります。どの列が文字/要素であるかを特定するための素早い方法が必要です。これらの列をダミー変数に変換した後、元のカテゴリ変数を削除できます。私が試した次

test <- 
    dat %>% 
    select_if(is.character) 

私は次のエラーを取得:

Error: Selection with predicate currently require local sources 

私も試してみた:

cls <- sapply(dat, class) 
cls 

をしかし、私は得る:

> cls 

     src   ops 
    [1,] "src_spark" "op_base_remote" 
    [2,] "src_sql" "op_base" 
    [3,] "src"  "op" 

これを行う方法に関するご意見はありますか?

答えて

2

ストレッチだろうが、あなたがこの(purrは便宜的に使用されている)のような何かしようとすることができ、「最良の」これを呼び出すと次のように使用することができます

columns_for_type <- function(sc, name, type="StringType") { 
    spark_session(sc) %>% 
    invoke("table", name) %>% 
    # Get (name, type) tuples 
    invoke("dtypes") %>% 
    # Filter by type 
    purrr::keep(function(x) invoke(x, "_2") == type) %>% 
    purrr::map(function(x) invoke(x, "_1")) 
} 

library(sparklyr) 
library(dplyr) 

sc <- spark_connect(master = "local[*]") 
iris_tbl <- copy_to(sc, iris, name="iris", overwrite=TRUE) 

columns_for_type(sc, "iris", "StringType") 
[[1]] 
[1] "Species" 
を結果はすることができ
columns_for_type(sc, "iris", "DoubleType") 
[[1]] 
[1] "Sepal_Length" 

[[2]] 
[1] "Sepal_Width" 

[[3]] 
[1] "Petal_Length" 

[[4]] 
[1] "Petal_Width" 

あなたがdata.frameとして単一の行を取ることによって、同様のアプローチを使用することができます

iris_tbl %>% select_(.dots=columns_for_type(sc, "iris", "StringType")) 
Source: query [150 x 1] 
Database: spark connection master=local[8] app=sparklyr local=TRUE 

    Species 
    <chr> 
1 setosa 
2 setosa 
3 setosa 
4 setosa 
5 setosa 
6 setosa 
7 setosa 
8 setosa 
9 setosa 
10 setosa 
# ... with 140 more rows 

select_に渡さ

iris_tbl %>% head(n=1) %>% as.data.frame %>% lapply(class) 

が、それは追加のスパークアクションが必要です。