问题描述
在sparlyr中将双精度字符转换为字符时,我遇到非常奇怪的行为。 似乎周期是随机添加的。 这是一个可复制的示例:
my_test_df <- data.frame(char_val = 004545,char_val2 = 100286908074)
my_test_spark <- my_test_df %>% copy_to(sc,.,'my_test_df_spark',overwrite = TRUE)
my_test_spark
## Source: spark<my_test_df_spark> [?? x 2]
## char_val char_val2
## <dbl> <dbl>
## 4545 100286908074
my_test_spark %>%
mutate(char_val = lpad(as.character(char_val),6,"0"),char_val2 = lpad(as.character(char_val2),13,"0")) %>%
head
## Source: spark<?> [?? x 2]
## char_val char_val2
## <chr> <chr>
## 4545.0 1.00286908074
我真的不明白为什么我在最后的字符串中有随机句点。有办法避免吗?
解决方法
as.character(char_val2)
正在以科学计数法获得价值。 lpad
正在删减科学计数法。
my_test_spark %>%
mutate(char_val3 = as.character(char_val2))
#> # Source: spark<?> [?? x 3]
#> char_val char_val2 char_val3
#> <dbl> <dbl> <chr>
#> 1 4545 100286908074 1.00286908074E11
对于第一列中的.0
,看起来as.character
tbl_spark
列上的double
将添加.0
。您可以将其转换为整数以防止这种情况。
library(bit64)
my_test_spark %>%
mutate(char_val = lpad(as.character(as.integer(char_val)),6,"0"),char_val2 = lpad(as.character(as.integer64(char_val2)),13,"0"))
#> # Source: spark<?> [?? x 2]
#> char_val char_val2
#> <chr> <chr>
#> 1 004545 0100286908074
请注意,char_val2
必须是64位整数。