【问题标题】:sparklyr convert double to charactersparklyr 将双精度转换为字符
【发布时间】:2020-12-15 20:18:09
【问题描述】:

在 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

我真的不明白为什么最后的字符串中有随机句点。有办法避免吗?

【问题讨论】:

    标签: string csv sparklyr


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      相关资源
      最近更新 更多