使用 sparklyr 将列数据类型更改为因子
Changing column data type to factor with sparklyr
我是 Spark 的新手,目前正在通过 sparkly 包使用 R API 使用它。我从配置单元查询创建了一个 Spark 数据框。数据类型未在源 table 中正确指定,我正在尝试通过利用 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 泛型函数进行类型转换。例如:
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
中是否有类似的机制(我所知道的最接近的是 )。
我是 Spark 的新手,目前正在通过 sparkly 包使用 R API 使用它。我从配置单元查询创建了一个 Spark 数据框。数据类型未在源 table 中正确指定,我正在尝试通过利用 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 泛型函数进行类型转换。例如:
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
中是否有类似的机制(我所知道的最接近的是