google-bigquery - 加载 Parquet 文件时,Google BigQuery 失败并显示“查询执行期间超出资源:UDF 内存不足”
问题描述
我们使用 BigQuery Java API 从本地数据源上传数据,如此处所述。上传包含 18 列(16 个字符串、1 个 float64、1 个时间戳)和 13 个 Mio 行(例如 17GB 数据)的 Parquet 文件时,上传失败,并出现以下异常:
查询执行期间资源超出:UDF 内存不足。;未能读取 Parquet 文件。如果文件包含太大的行,或者为查询列加载的页面的总大小太大,则可能会发生这种情况。
但是,当使用 CSV(17.5GB 数据)上传相同的数据时,上传成功。我的问题是:
- 上传 Parquet 或 CSV 有什么区别?
- 上传期间执行什么查询?
- 是否可以增加此查询的内存?
谢谢托拜厄斯
解决方案
Parquet 是列式数据格式,这意味着加载数据需要读取所有列。在parquet中,列分为页面。BigQuery 在从内存中读取数据时,会将每列的整个未压缩页面保留在内存中。如果输入文件包含太多列,BigQuery 工作人员可能会遇到Out of Memory
错误。
即使没有像其他格式那样强制执行精确的限制,建议记录应该在 50 Mb 的范围内,加载更大的记录可能会导致resourcesExceeded
错误。
考虑到上述考虑,最好澄清以下几点:
- Parquet 文件中的最大行数是多少?
- 每列的最大页面大小是多少?
可以通过公开工具检索此信息。
如果您考虑增加查询的分配内存,则需要阅读Bigquery slots。
推荐阅读
- watson-openscale - AWS SageMaker 上的负载日志记录
- android - 显示对话框时背景屏幕变为非交互
- atg - 是否可以在 atg 中的单个提交上调用多个处理程序方法?
- java - 如何在 Java 中使用正则表达式将 ":abc,cde\t" 替换为 ",abc|cde"?
- c - (在 C 中模拟 UNIX 外壳)如何在 for 循环中实现多个管道?
- excel - 循环遍历 Excel 行,将它们复制并粘贴到单独的 Power Point 幻灯片中
- jquery - 使用 jQuery 时,总是等待项目完全加载后再计算它们
- python - 如何在 Kivy、python 中创建 Button 的子类
- java - 有没有办法使用java从rest api类访问graphql端点?
- opengl-es - VAO 的内存占用