用Pandas.read_gpq加载带有列表列的表后,如何恢复结构?

时间:2018-11-14 15:35:33

标签: pandas google-bigquery

我有一个包含嵌套记录的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 个答案:

答案 0 :(得分: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(),第二个示例的可伸缩性较差