在 SparkR 中添加前导零

Adding leading zeros in SparkR

我有一个名为 nfe 的 Spark DataFrame,它包含一个名为 NFE_CNPJ_EMITENTE 的列,该列当前被格式化为字符串(尽管它完全是数字)。此列应具有长度为 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")

对于 select 数据框中的所有变量,查询将如下所示:

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")