如何使用 s3 select 从镶木地板文件中获取所有列的列表?

Cod*_*ter 5 java sql amazon-s3 parquet amazon-s3-select

我有一个存储在 S3 存储桶中的镶木地板文件。我想获取镶木地板文件的所有列的列表。我正在使用,s3 select但它只是给了我没有任何列标题的所有行的列表。

有没有办法从这个镶木地板文件中获取所有列名而不完全下载它?由于镶木地板文件可能非常大,我不想下载整个镶木地板文件,这就是为什么我使用s3 select选择前几行

select * from S3Object LIMIT 10
Run Code Online (Sandbox Code Playgroud)

我试图通过执行显式获取列名

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'S3Object'
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为 AWS S3 尚不支持此功能。

有没有其他方法可以实现相同的目标?

小智 3

我也有同样的问题,但不幸的是,这次我的谷歌功夫不够强。

我发现了以下我不太喜欢的解决方法,但它对我有用:

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()))
Run Code Online (Sandbox Code Playgroud)

即代码的作用是请求数据的第一行,提取有效负载并加载返回的 JSON 对象。获得的 JSON 对象具有以下结构{"Column name": "value", ....},因此只需提取 JSON 对象的键(最后一行)。

另一个问题是这不会返回列的类型。这是我目前还无法解决的问题。

更新: 我观察到,在某些情况下,某些列名称的报告不正确。返回的不是真实姓名,如 _18、_19。不知道如何处理它。