在SparkR中添加前导零

在SparkR中添加前导零,r,apache-spark,sparkr,leading-zero,R,Apache Spark,Sparkr,Leading Zero,我有一个名为nfe的Spark数据帧,其中包含一个名为nfe_CNPJ_emittente的列,该列当前的格式为字符串,尽管它是完全数字的。此列应该有长度为11或14个字符的条目,但有长度为9、10、12和13个字符的条目需要添加前导零 但是,我不能像在R中那样使用sprintf函数: nfe$CNPJ_EMITENTE <- ifelse(nfe$length_emit == 9, sprintf("%00s", nfe$NFE_CNPJ_EMITENTE), nfe$NFE_CNPJ_

我有一个名为nfe的Spark数据帧,其中包含一个名为nfe_CNPJ_emittente的列,该列当前的格式为字符串,尽管它是完全数字的。此列应该有长度为11或14个字符的条目,但有长度为9、10、12和13个字符的条目需要添加前导零

但是,我不能像在R中那样使用sprintf函数:

nfe$CNPJ_EMITENTE <- ifelse(nfe$length_emit == 9, sprintf("%00s", nfe$NFE_CNPJ_EMITENTE), nfe$NFE_CNPJ_EMITENTE)

# Error in sprintf("%00s", nfe$NFE_CNPJ_EMITENTE) : unsupported type
是否有一种简单的方法可以为9和12个长度条目添加2个前导零,为11和13个长度条目添加1个前导零

谢谢

R的ifelse在sparkR s4对象上有问题。对于这一点以及许多其他麻烦的数据操作,一个简单的解决方案是将其转换为SQL查询:

#Setup SQL context
sqlContext <- sparkRSQL.init(sc)
sqlContext <- SQLContext(sc)

# Register your dataframe as a table
registerTempTable(df, 'df')

#Query your dataframe
sql(sqlContext, "SELECT [other variables], 
                        case when LENGTH(NFE_CNPJ_EMITENTE) in (9,12) then concat('00',NFE_CNPJ_EMITENTE)
                        when LENGTH(NFE_CNPJ_EMITENTE) in (10,13) then concat('0',NFE_CNPJ_EMITENTE)
                        else NFE_CNPJ_EMITENTE end as NFE_CNPJ_EMITENTE
                  FROM df")

我似乎还是有麻烦。首先,不推荐使用RegisterEmptableDF'df',我使用createOrReplaceTempViewnfe'nfe代替。这是正确的吗?其次,我对SQL查询不太熟悉-在上面的SQL命令中,[other variables]是否引用了dataframe中的每一列?此外,当我运行上面的代码时,我在SQL命令的每一行都收到一条错误消息:错误:SQLContext中的意外数字常量,对于所有注释,请从nfeApologies中选择并输入意外符号,但我是否做错了一件简单的事情?为了让您的问题1有效2是,它指的是将它们全部放在逗号分隔的列表中,例如var1、var2、var3。。。。如果有多个变量,可以使用select*选择所有变量,但需要更改重新编码变量的名称,以避免两列名称相同。3错误可能是SQL语法问题。如果你在这里评论你的完整查询,我可以看一看
sql(sqlContext, "SELECT df.*, 
                        case when LENGTH(NFE_CNPJ_EMITENTE) in (9,12) then concat('00',NFE_CNPJ_EMITENTE)
                        when LENGTH(NFE_CNPJ_EMITENTE) in (10,13) then concat('0',NFE_CNPJ_EMITENTE)
                        else NFE_CNPJ_EMITENTE end as NFE_CNPJ_EMITENTE_RECODED
                  FROM df")