如何在使用 Pandas.read_gbq 加载带有列表列的表后恢复结构?

Posted

技术标签:

【中文标题】如何在使用 Pandas.read_gbq 加载带有列表列的表后恢复结构?【英文标题】:How can I restore structure after loading table with list-columns with Pandas.read_gpq? 【发布时间】:2018-11-14 15:35:33 【问题描述】:

我有一个包含嵌套记录的 BQ 表。单个记录看起来与此类似:


    "event_date": "2018-11-14",
    "event_params": [
        
            "string": "foo",
            "int": null
        ,
        
            "string": "52.49",
            "int": null
        
    ]

您可以通过复制在 pandas / CSV 中表示这一点。在上面的单个记录的特定情况下,它将变成两行:

,event_date   event_params.string  event_params.int
1,2018-11-14  foo                  null
2,2018-11-14  52.49                null  

请注意,这样的导出是一种单向选项。无法判断 12 这两行是属于单个记录还是属于两个记录。一种解决方案是为每条记录添加一个标识符。

BQ 是否有记录的内部标识符?

SELECT * FROM `my-table.foobar.events_20181110`

我没有得到行标识符。

【问题讨论】:

【参考方案1】:

BQ 是否有记录的内部标识符?

您可以生成这样的标识符 - 请参阅下面的示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT ['a', 'b', 'c'] arr UNION ALL
  SELECT ['x', 'y'] 
)
SELECT id, item FROM (
  SELECT GENERATE_UUID() id, arr
  FROM `project.dataset.table`
), UNNEST(arr) item 

结果

Row id                                      item     
1   4f47d6c2-a6d8-4923-8c20-5836a9a89d36    a    
2   4f47d6c2-a6d8-4923-8c20-5836a9a89d36    b    
3   4f47d6c2-a6d8-4923-8c20-5836a9a89d36    c    
4   1d348ac5-ec5a-4065-a4ec-46404a7ca193    x    
5   1d348ac5-ec5a-4065-a4ec-46404a7ca193    y    

#standardSQL
WITH `project.dataset.table` AS (
  SELECT ['a', 'b', 'c'] arr UNION ALL
  SELECT ['x', 'y'] 
)
SELECT id, item FROM (
  SELECT ROW_NUMBER() OVER() id, arr
  FROM `project.dataset.table`
), UNNEST(arr) item

结果为

Row id  item     
1   1   a    
2   1   b    
3   1   c      
4   2   x    
5   2   y    

请记住,由于使用了 ROW_NUMBER(),第二个示例的可扩展性较差

【讨论】:

非常感谢您的精彩回答!

以上是关于如何在使用 Pandas.read_gbq 加载带有列表列的表后恢复结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 pandas.read_gbq 推断列的数据类型

在 Jupyter Notebook 中进行时,pandas.read_gbq() 在哪里“保存”查询?

使用 Dataflow 的 Pandas read_gbq 初始化错误

pandas read_gbq 不工作并显示错误

尝试使用 pandas.read_gbq() 函数时,pandas-gbq 抛出错误“找不到字段 google.protobuf.FileOptions.php_metadata_namespace”

如果存在于列表中,则根据另一列的值选择列