如何在使用 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
请注意,这样的导出是一种单向选项。无法判断 1
和 2
这两行是属于单个记录还是属于两个记录。一种解决方案是为每条记录添加一个标识符。
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 加载带有列表列的表后恢复结构?的主要内容,如果未能解决你的问题,请参考以下文章
在 Jupyter Notebook 中进行时,pandas.read_gbq() 在哪里“保存”查询?
使用 Dataflow 的 Pandas read_gbq 初始化错误
尝试使用 pandas.read_gbq() 函数时,pandas-gbq 抛出错误“找不到字段 google.protobuf.FileOptions.php_metadata_namespace”