Bigrquery 强制将字符串强制转换为整数(模式是字符串)

Posted

技术标签:

【中文标题】Bigrquery 强制将字符串强制转换为整数(模式是字符串)【英文标题】:Bigrquery forcefully coerces strings to integers (schema is a string) 【发布时间】:2018-11-23 02:52:18 【问题描述】:

我正在使用邮政编码,其中当然有前导零。我正确加载了我的数据框以保留 R 中的前导零,但上传步骤似乎失败了。这就是我的意思:

这是我的 minimum.csv 文件:

zip,val
07030,10
10001,100
90210,1000
60602,10000

这是 R 代码

require("bigrquery")
filename <- "minimal.csv"
tablename <- "as_STRING"
ds <- bq_dataset(project='myproject', dataset="zips")

我还在我的架构中正确设置了类型以期望它们为字符串。

# first pass
df <- read.csv(filename, stringsAsFactors=F)
# > df
#     zip   val
# 1  7030    10
# 2 10001   100
# 3 90210  1000
# 4 60602 10000

# uh oh!  Let's fix it!

cols <- unlist(lapply(df, class))
cols[[1]] <- "character" # make zipcode a character

# then reload
df2 <- read.csv(filename, stringsAsFactors=F, colClasses=cols)
# > df2
#     zip   val
# 1 07030    10
# 2 10001   100
# 3 90210  1000
# 4 60602 10000

# much better!  You can see my zips are now strings.

但是,当我尝试上传字符串时,bigrquery 界面会抱怨我正在上传整数,但事实并非如此。这是架构,需要字符串:

# create schema
bq_table_create(bq_table(ds, tablename), fields=df2) # using df2, which has strings

# now prove it got the strings right:
    > bq_table_meta(bq_table(ds, tablename))$schema$fields
    [[1]]
    [[1]]$name
    [1] "zip"

    [[1]]$type
    [1] "STRING"                # GOOD, ZIP IS A STRING!

    [[1]]$mode
    [1] "NULLABLE"


    [[2]]
    [[2]]$name
    [1] "val"

    [[2]]$type
    [1] "INTEGER"

    [[2]]$mode
    [1] "NULLABLE"

现在是时候上传了....

bq_table_upload(bq_table(ds, tablename), df2) # using df2, with STRINGS
Error: Invalid schema update. Field zip has changed type from STRING to INTEGER [invalid]

嗯?这个无效的架构更新是什么?如何阻止它尝试将我的字符串(数据包含和架构是)更改为整数,我的数据不包含,架构不包含?

是否正在发生 javascript 序列化并将我的字符串转回整数?

【问题讨论】:

【参考方案1】:

这是因为 BigQuery 会在未指定架构时自动检测架构。这可以通过指定fields 参数来解决,如下所示(有关详细信息,请参阅this similar question):

bq_table_upload(bq_table(ds, tablename), df2,fields = list(bq_field("zip", "string"),bq_field("val", "integer")))

更新:

查看代码,bq_table_upload 正在调用bq_perform_upload,它将参数fields 作为架构。最后,它将data frame 解析为JSON 文件以将其上传到BigQuery。

【讨论】:

谢谢。这是一个有用的答案。这对于包来说也很奇怪,为什么接口默认会自动检测而不是使用数据框给出的数据类型呢? @Mittenchops 我在答案中添加了更多代码细节。我可以说最简单的方法是为函数提供 fields 参数,但您可能需要为您的用例编辑代码。【参考方案2】:

简单的改变:

bq_table_upload(tab, df)

bq_table_upload(tab, df, fields=df)

有效。

【讨论】:

确实如此!谢谢! 再次感谢!!!它在 2022 年仍然有效 我想知道为什么这不是默认行为? 刚刚发送了一个 PR 以使用输入 df 作为字段源。希望他们接受。

以上是关于Bigrquery 强制将字符串强制转换为整数(模式是字符串)的主要内容,如果未能解决你的问题,请参考以下文章

ASP强制转换成整数!

Python变量类型的强制转换

强制类型转换和隐式类型转换

如何用js把字符串转化为整型

在PHP中如何强制转化成字符串

强制类型转换 字符串和数字互相怎么转换