sparklyr将双精度字符转换为字符

问题描述

在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位整数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...