使用自定义列名将 Avro 文件加载到具有嵌套记录的 GCS

Posted

技术标签:

【中文标题】使用自定义列名将 Avro 文件加载到具有嵌套记录的 GCS【英文标题】:Load Avro file to GCS with nested record using customized column name 【发布时间】:2019-04-15 23:01:10 【问题描述】:

我试图加载带有嵌套记录的 Avro 文件。其中一项记录是模式的联合。加载到 BigQuery 时,它会在每个联合元素上创建一个非常长的名称,例如 com_mycompany_data_nestedClassname_value。这个名字好长想知道是否有一种方法可以指定名称而不用前缀完整的包名称。

例如。以下 Avro 架构


    "type": "record",
    "name": "EventRecording",
    "namespace": "com.something.event",
    "fields": [
        
            "name": "eventName",
            "type": "string"
        ,
        
            "name": "eventTime",
            "type": "long"
        ,
        
            "name": "userId",
            "type": "string"
        ,
        
            "name": "eventDetail",
            "type": [
                
                    "type": "record",
                    "name": "Network",
                    "namespace": "com.something.event",
                    "fields": [
                        
                            "name": "hostName",
                            "type": "string"
                        ,
                        
                            "name": "ipAddress",
                            "type": "string"
                        
                    ]
                ,
                
                    "type": "record",
                    "name": "DiskIO",
                    "namespace": "com.something.event",
                    "fields": [
                        
                            "name": "path",
                            "type":  "string"
                        ,
                        
                            "name": "bytesRead",
                            "type": "long"
                        
                    ]
                
            ]
        
    ]

想出了

是否可以将 eventDetail.com_something_event_Network_value 之类的长字段名称设置为 eventDetail.Network

【问题讨论】:

【参考方案1】:

Avro 加载不如 BigQuery 中应有的灵活(基本示例是它不支持加载字段的子集(读取器架构)。此外,BigQuery 目前不支持重命名列refer here . 只有选项是使用正确的名称重新创建表(从现有表创建新表)或从以前的表重新创建表

【讨论】:

看起来好像没有文档记录,但是您实际上可以在加载 Avro 文件时指定一个模式来加载字段的子集。如果您要加载到其架构是 Avro 文件子集的现有表,这也适用。只会加载指定/表模式中的字段。 这很有趣。你有一个示例如何使用模式的子集加载数据吗? 这是来自示例 Avro 文件的架构。它表示具有两个字段 re 和 im 的复数。 "type" : "record", "name" : "cpx", "fields" : [ "name" : "re", "type" : "long", "doc" : "re field doc." , "name" : "im", "type" : "long", "doc" : "im field doc." ] 此命令仅加载 re 字段:bq load --source_format=AVRO dataset.table path/to/file.avro 're:integer' 该表将仅使用一个字段 re:integer 创建。

以上是关于使用自定义列名将 Avro 文件加载到具有嵌套记录的 GCS的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:加载具有日期列数据类型的 avro 文件,只要转换为时间戳

如何将 Avro 文件加载到具有“时间戳”类型的列的 BigQuery 表中

如何将 AVRO 文件中的整数值加载到 bigquery 中的日期列?

Avro 列中的 NULL 值加载为 VARIANT NULL

如何从具有 DATE 列的 BigQuery 表中导出 AVRO 文件并将其再次加载到 BigQuery

Spark Sql 查询嵌套记录。我想先过滤嵌套的记录数组,然后爆炸(将它们展开成行)