java - 如何使用 s3 select 从 Parquet 文件中获取所有列的列表?

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

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

有没有办法从这个 Parquet 文件中获取所有列名称而不完全下载它?由于 parquet 文件可能非常大,我不想下载整个 parquet 文件,这就是为什么我使用 s3 select 使用

选择前几行
select * from S3Object LIMIT 10

我尝试通过执行以下操作显式获取列名称

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'S3Object'

但它无法工作,因为 AWS S3 尚不支持此功能。

还有其他方法可以达到同样的效果吗?

最佳答案

我也遇到了同样的问题,但不幸的是,这次我的 Google 功夫不够强。

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

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。不知道如何处理。

关于java - 如何使用 s3 select 从 Parquet 文件中获取所有列的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57448205/

相关文章:

Java作业。 boolean 逻辑有问题

java - 如何在java中以点为基础分割一条线?

sql - 表中不存在的行

sql - 无法在oracle sql中将时间戳转换为字符或日期

jquery - XMLHttpRequest 无法加载 请求的资源上不存在 'Access-Control-Allow-Origin' header 。 AWS S3、Retina.JS

java - Spark没有注册输出操作,所以没有什么可执行的,但我正在写入文件

Point 类的 Java hashCode

java - Android:当我传递 Null 时,构造函数是不明确的,但当我传递分配给 Null 的变量时则不是

SQL 查询在 "IN"子句中处理 19 个项目时运行速度很快,而在处理 20 个项目时速度慢得多。为什么?

html - 使用 Plupload HTML5 运行时直接上传到 Amazon S3