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

时间:2019-08-11 16:04:11

标签: java sql amazon-s3 parquet amazon-s3-select

我有一个实木复合地板文件存储在S3存储桶中。我想获取镶木地板文件所有列的列表。我正在使用s3 select,但它只为我提供所有列标题之外的所有行的列表。

总有没有从此镶木地板文件中获取所有列名而无需完全下载它吗?由于镶木地板文件可能很大,因此我不想下载整个镶木地板文件,这就是为什么我使用s3 select来使用

来选择前几行的原因
select * from S3Object LIMIT 10

我尝试通过

显式获取列名。
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'S3Object'

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

还有其他方法可以实现相同目标吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,但不幸的是,这次我的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对象的键(最后一行)即可。

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

更新: 我观察到在某些情况下,某些列名报告不正确。代替了_18,_19之类的真实姓名。不知道如何处理。