我是Spark的新手,目前正在通过Sparkly包通过R API使用它。我从配置单元查询创建了一个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)
Run Code Online (Sandbox Code Playgroud)
如果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....
Run Code Online (Sandbox Code Playgroud)
有人可以建议如何对Spark Data Frame进行所需的更改吗?
在RI中有一个spark连接,一个DataFrame为ddf。
library(sparklyr)
library(tidyverse)
sc <- spark_connect(master = "foo", version = "2.0.2")
ddf <- spark_read_parquet(sc, name='test', path="hdfs://localhost:9001/foo_parquet")
Run Code Online (Sandbox Code Playgroud)
由于行数不多,因此我想将其存储到内存中以应用一些机器学习魔术。但是,似乎无法收集某些行。
df <- ddf %>% head %>% collect # works fine
df <- ddf %>% collect # doesn't work
Run Code Online (Sandbox Code Playgroud)
第二行代码将引发Error in rawToChar(raw) : embedded nul in string:错误。失败的列/行具有一些字符串数据。由于head %>% collect工作表明某些行似乎失败,而其他行则按预期工作。
我如何解决此错误,有没有办法清除该错误?该错误实际上是什么意思?
在我使用sparklyrwith yarn-client方法管理它连接到我们的(新)集群之后,现在我只能显示默认方案中的表.我该如何连接scheme.table?使用DBI它正在工作,例如使用以下行:
dbGetQuery(sc, "SELECT * FROM scheme.table LIMIT 10")
在HUE中,我可以显示所有方案中的所有表.
〜g ^
我sparklyr在Windows服务器上使用Spark 2.0.2与RStudio 上的0.5.4-9004 结合使用.
每隔一段时间,当我尝试从spark服务器收集,读取或写入数据时,我收到以下错误:
Error in UseMethod("invoke") :
no applicable method for 'invoke' applied to an object of class "character"
Run Code Online (Sandbox Code Playgroud)
我不确定这是服务器问题,还是有问题sparklyr.
到目前为止,我必须解决这个问题的唯一方法是重新启动sparklyr与Spark 的连接.
这是我正在使用的简单代码:
sc <- spark_connect(master = "spark://####:7077")
tibble_file_parquet <- spark_read_parquet(
sc, "file_parquet", path, overwrite = TRUE)
result <- tibble_file_parquet %>% count(x, y)
collect(result)
Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以使用sparklyr / dplyr函数复制Spark数据帧的行?
sc <- spark_connect(master = "spark://####:7077")
df_tbl <- copy_to(sc, data.frame(row1 = 1:3, row2 = LETTERS[1:3]), "df")
Run Code Online (Sandbox Code Playgroud)
这是所需的输出,保存到新的spark tbl中:
> df2_tbl
row1 row2
<int> <chr>
1 1 A
2 1 A
3 1 A
4 2 B
5 2 B
6 2 B
7 3 C
8 3 C
9 3 C
Run Code Online (Sandbox Code Playgroud) 考虑这个使用的简单示例sparklyr:
library(sparklyr)
library(janeaustenr) # to get some text data
library(stringr)
library(dplyr)
mytext <- austen_books() %>%
mutate(label = as.integer(str_detect(text, 'great'))) #create a fake label variable
mytext_spark <- copy_to(sc, mytext, name = 'mytext_spark', overwrite = TRUE)
# Source: table<mytext_spark> [?? x 3]
# Database: spark_connection
text book label
<chr> <chr> <int>
1 SENSE AND SENSIBILITY Sense & Sensibility 0
2 "" Sense & Sensibility 0
3 by Jane Austen Sense & Sensibility 0
4 "" Sense & Sensibility 0
5 …Run Code Online (Sandbox Code Playgroud) 我在spark数据框中有5亿行。我对sample_nfrom 感兴趣,dplyr因为它将允许我明确指定所需的样本量。如果要使用sparklyr::sdf_sample(),我首先必须计算sdf_nrow(),然后创建指定的数据分数sample_size / nrow,然后将该分数传递给sdf_sample。这没什么大不了的,但是sdf_nrow()要花一些时间才能完成。
因此,dplyr::sample_n()直接使用将是理想的选择。但是,经过一些测试,它看起来并不是sample_n()随机的。实际上,结果与head()!相同!如果函数不是随机抽样行,而是返回第一n行,那将是一个主要问题。
有人可以确认吗?是sdf_sample()我最好的选择吗?
# install.packages("gapminder")
library(gapminder)
library(sparklyr)
library(purrr)
sc <- spark_connect(master = "yarn-client")
spark_data <- sdf_import(gapminder, sc, "gapminder")
> # Appears to be random
> spark_data %>% sdf_sample(fraction = 0.20, replace = FALSE) %>% summarise(sample_mean = mean(lifeExp))
# Source: lazy query [?? x 1]
# Database: spark_connection
sample_mean
<dbl>
1 58.83397
> spark_data …Run Code Online (Sandbox Code Playgroud) 考虑在spark中有2个表或表引用要比较,例如,以确保备份正常工作.是否有可能在火花中做那个遥控?因为使用将所有数据复制到R没有用collect().
library(sparklyr)
library(dplyr)
library(DBI)
##### create spark connection here
# sc <- spark_connect(<yourcodehere>)
spark_connection(sc)
spark_context(sc)
trees1_tbl <- sdf_copy_to(sc, trees, "trees1")
trees2_tbl <- sdf_copy_to(sc, trees, "trees2")
identical(trees1_tbl, trees2_tbl) # FALSE
identical(collect(trees1_tbl), collect(trees2_tbl)) # TRUE
setequal(trees1_tbl, trees2_tbl) # FALSE
setequal(collect(trees1_tbl), (trees2_tbl)) # TRUE
spark_disconnect(sc)
Run Code Online (Sandbox Code Playgroud)
会很好,如果dplyr::setequal()可以直接使用.
有没有人有任何关于如何将树信息从sparklyr的ml_decision_tree_classifier,ml_gbt_classifier或ml_random_forest_classifier模型转换为.)格式的建议,这种格式可以被其他R树相关的库理解,并且(最终)b.)树的可视化用于非技术消费?这将包括从向量汇编器期间生成的替换字符串索引值转换回实际要素名称的能力.
为了提供一个例子,下面的代码从sparklyr博客文章中大量复制:
library(sparklyr)
library(dplyr)
# If needed, install Spark locally via `spark_install()`
sc <- spark_connect(master = "local")
iris_tbl <- copy_to(sc, iris)
# split the data into train and validation sets
iris_data <- iris_tbl %>%
sdf_partition(train = 2/3, validation = 1/3, seed = 123)
iris_pipeline <- ml_pipeline(sc) %>%
ft_dplyr_transformer(
iris_data$train %>%
mutate(Sepal_Length = log(Sepal_Length),
Sepal_Width = Sepal_Width ^ 2)
) %>%
ft_string_indexer("Species", "label")
iris_pipeline_model <- iris_pipeline %>%
ml_fit(iris_data$train)
iris_vector_assembler <- ft_vector_assembler(
sc,
input_cols = setdiff(colnames(iris_data$train), "Species"),
output_col = "features" …Run Code Online (Sandbox Code Playgroud) 如何使用 R 选择指定列之后的所有列(最好仅使用 dplyr,但欢迎使用非 dplyr 解决方案)。例如,在数据框中mtcars,我想抓取 后面的所有vs列am gear carb。但我想要一个函数来完成此任务,其中我只需提供选择的列,并且返回的数据帧仅包含指定列之后的那些列。我想不出一种方法来实现这一目标,让事情继续下去。
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 …Run Code Online (Sandbox Code Playgroud)