java - 如何使用 s3 select 从镶木地板文件中获取所有列的列表?
问题描述
我有一个存储在 S3 存储桶中的镶木地板文件。我想获取镶木地板文件的所有列的列表。我正在使用s3 select
,但它只是给了我所有行的列表,没有任何列标题。
无论如何从这个镶木地板文件中获取所有列名而不完全下载它?由于 parquet 文件可能非常大,我不想下载整个 parquet 文件,这就是为什么我使用s3 select
选择前几行的原因
select * from S3Object LIMIT 10
我试图通过执行显式获取列名
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'S3Object'
但它不起作用,因为 AWS S3 还不支持这一点。
有没有其他方法可以达到同样的效果?
解决方案
我也有同样的问题,但不幸的是,这次我的 Google-Kung-Fu 不够强。
我发现了以下我不太喜欢但对我有用的解决方法:
r = s3.select_object_content(Bucket='...your bucket...',
Key='...your key...',
ExpressionType='SQL',
Expression="select s.* from S3Object s limit 1",
InputSerialization={'Parquet': {}},
OutputSerialization={'JSON': {}})
row = json.loads([rec['Records']['Payload'].decode('utf-8') for rec in r['Payload'] if 'Records' in rec][0])
print("Columns: ", list(row.keys()))
即代码所做的是请求数据的第一行,提取有效负载并加载返回的 JSON 对象。获得的 JSON 对象具有以下结构{"Column name": "value", ....}
,因此只需提取 JSON 对象的键(最后一行)。
另一个问题是这不会返回列的类型。这是我还无法解决的问题。
更新: 我观察到在某些情况下,报告的某些列名不正确。_19 被返回,而不是像 _18 这样的真实姓名。不知道如何处理它。
推荐阅读
- sql - SQL 查询 - 移动小数点
- mysql - 在 mysql 8.0.22 上使用 percona xtrabackup 执行备份和恢复
- reactjs - 如何使用 reactjs 项目初始化模拟服务工作者(msw)
- r - 在 R 中重新排列数据框
- javascript - php的动态选择选项
- json - 无法解析 Ansible Jinja2 中的 JSON 列表
- javascript - 按钮颜色 onclick javascript
- gnuplot - Gnuplot 中散点图的“饼图”式数据点
- php - 只有“/”适用于 symfony 4.4 应用程序
- awk - 替换最后一个斜杠之前、引号之间和特定行上的文本