【问题标题】:Value issue in Float datatype in BigQuery, while loading data from AVRO and parquet into Bigquery tablesBigQuery 中 Float 数据类型的值问题,同时将数据从 AVRO 和 parquet 加载到 Bigquery 表中
【发布时间】:2022-01-20 03:44:42
【问题描述】:

我在使用 bq 加载作业或通过 apache-spark 数据帧从 BigQuery 中的 AVRO/Parquet 文件加载数据时遇到了一个奇怪的问题。

源文件具有值为 22.54 的浮点数据类型,但在将其加载到 BigQuery 后,它会自动更改为 22.540000915527344。

我尝试使用其他文件格式并直接使用 bq 加载作业和使用 spark 数据帧,但问题仍然存在。 我在加载后添加了 AVRO 文件数据和 BigQuery 数据的详细信息。

如果您遇到此问题,请告诉我并帮助我解决此问题。

下面提供了 AVRO 架构:

{
  "type" : "record",
  "name" : "topLevelRecord",
  "fields" : [ {
    "name" : "id",
    "type" : "int"
  }, {
    "name" : "cp",
    "type" : "float"
  } ]
}

AVRO 数据:

| id  | cp  |
|-----|-----|
|  1  |22.54|

BigQuery 数据:

| id  | cp               |
|-----|------------------|
|  1  |22.540000915527344|

【问题讨论】:

  • 在插入表格之前,您是否尝试过对值进行四舍五入,即:ROUND(val, 2)?如果在插入数据集表之前对值进行四舍五入,即使列是 FLOAT64,您也应该能够保留 2 位小数。
  • 如果您使用的是传输作业,您可以将小数类型设置为 2。

标签: apache-spark google-cloud-platform google-bigquery avro parquet


【解决方案1】:

如果您使用 float 数据类型(使用 32 位)与 double(64 位),您可能会遇到此类错误。

22.54float representation22.54000091552734375

如果you switch to double you get22.5399999999999991473487170879 更接近 22.54。

您会发现 big query 和 avro 之间存在差异,因为它们在显示数据时使用了不同的舍入策略。但在引擎盖下,数据是相同的。两个系统之间的转换应该损失更少。

【讨论】:

  • 有没有一种方法可以让我们获得与 AVRO 中完全相同的值。对于我们的数据集,值可能是 2 位或多于 2 位小数。我们希望保持价值的准确性。
  • avro中的值为22.54000091552734375,只是AVRO将其格式化为22.54。如果你想要更高的精度,你应该从浮点数切换到双精度数。但是您仍然可能会遇到类似的问题。另一种方法是使用小数,但它们没有得到广泛支持。 avro.apache.org/docs/current/spec.html#Decimal
猜你喜欢
  • 1970-01-01
  • 2020-04-05
  • 2019-02-22
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多