【问题标题】:INT32 type error when scanning parquet federated table. Bug or Expected behavior?扫描 parquet 联合表时出现 INT32 类型错误。错误或预期行为?
【发布时间】:2020-07-22 00:00:41
【问题描述】:

我正在使用 BigQuery 查询外部数据源(也称为联合表),其中源数据是存储在 google 云存储中的 hive 分区 parquet 表。我使用this guide 来定义表格。

我测试此表的第一个查询如下所示

SELECT * FROM my_dataset.my_table WHERE year=2019 AND day = "2019-01-01" LIMIT 10

此查询失败并出现以下错误

列 visitor_partition 的类型为 INT64,与预期的 INT32 类型不同

我想知道为什么会出现这个错误以及如何解决它或解决它。我使用parquet-tools 库进行了一些调查,以窥探我的镶木地板数据的内部结构。

当我在我的一个 parquet 文件上运行 java -jar ./parquet-tools-1.10.0.jar meta test.c000.gz.parquet | grep visitor_partition 时,会返回以下相关行

visitor_partition:          OPTIONAL INT64 R:0 D:1
visitor_partition:           INT64 GZIP DO:0 FPO:59420041 SZ:54561/537912/9.86 VC:633590 ENC:BIT_PACKED,PLAIN_DICTIONARY,RLE ST:[min: 0, max: 99, num_nulls: 0]

当我运行架构命令时,会出现以下相关架构信息optional int64 visitor_partition;

很明显,在这个 parquet 文件中,visitor_partition 字段的数据表示为 INT64。那么为什么 BigQuery 期望在这里看到 INT32 类型呢?

【问题讨论】:

    标签: google-bigquery parquet parquet-mr


    【解决方案1】:

    请注意,外部表的架构是从与表的源 URI 匹配的所有文件列表中按文件名按字典顺序排序的最后一个文件推断出来的。 因此,在您的案例中,特定 Parquet 文件的架构可能与您描述的架构不同,例如,“visitor_partition”字段具有 DATE 逻辑类型的 INT32 列 - BigQuery 将推断为 DATE 类型。

    【讨论】:

    • 我不确定您所说的“永久表”是什么意思。这个问题都是关于查询外部/联合表的——所以也许这不是一个永久表? visitor_partition 字段在表架构中属于“INTEGER”类型。
    • 您评论的第二部分确实突出了问题的原因。谢谢!当我用parquet-tools 对我的数据集中按字典顺序排列的文件进行示例时,我看到它使用32 位int 表示visitor_partition 列。您可以修改答案以仅包含第二段吗?
    • 是的,修改了答案。
    • “永久外部表”是您显式创建的表,可以跨查询使用,请参见此处:cloud.google.com/bigquery/…
    • 谢谢@Li Tan。我不知道有临时外部表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多