当前位置: 首页 > 面试题库 >

从AWS s3存储桶读取实木复合地板数据

祁鸿晖
2023-03-14
问题内容

我需要从AWS S3读取实木复合地板数据。如果我为此使用aws sdk,则可以得到如下输入流:

S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, bucketKey));
InputStream inputStream = object.getObjectContent();

但是apache木地板阅读器仅使用本地文件,如下所示:

ParquetReader<Group> reader =
                    ParquetReader.builder(new GroupReadSupport(), new Path(file.getAbsolutePath()))
                            .withConf(conf)
                            .build();
reader.read()

所以我不知道如何解析实木复合地板文件的输入流。例如,对于csv文件,存在使用inputstream的CSVParser。

我知道使用Spark实现此目标的解决方案。像这样:

SparkSession spark = SparkSession
                .builder()
                .getOrCreate();
Dataset<Row> ds = spark.read().parquet("s3a://bucketName/file.parquet");

但是我不能使用火花。

谁能告诉我从s3读取镶木地板数据的任何解决方案?


问题答案:
String SCHEMA_TEMPLATE = "{" +
                        "\"type\": \"record\",\n" +
                        "    \"name\": \"schema\",\n" +
                        "    \"fields\": [\n" +
                        "        {\"name\": \"timeStamp\", \"type\": \"string\"},\n" +
                        "        {\"name\": \"temperature\", \"type\": \"double\"},\n" +
                        "        {\"name\": \"pressure\", \"type\": \"double\"}\n" +
                        "    ]" +
                        "}";
String PATH_SCHEMA = "s3a";
Path internalPath = new Path(PATH_SCHEMA, bucketName, folderName);
Schema schema = new Schema.Parser().parse(SCHEMA_TEMPLATE);
Configuration configuration = new Configuration();
AvroReadSupport.setRequestedProjection(configuration, schema);
ParquetReader<GenericRecord> = AvroParquetReader.GenericRecord>builder(internalPath).withConf(configuration).build();
GenericRecord genericRecord = parquetReader.read();

while(genericRecord != null) {
        Map<String, String> valuesMap = new HashMap<>();
        genericRecord.getSchema().getFields().forEach(field -> valuesMap.put(field.name(), genericRecord.get(field.name()).toString()));

        genericRecord = parquetReader.read();
}

Gradle依赖

    compile 'com.amazonaws:aws-java-sdk:1.11.213'
    compile 'org.apache.parquet:parquet-avro:1.9.0'
    compile 'org.apache.parquet:parquet-hadoop:1.9.0'
    compile 'org.apache.hadoop:hadoop-common:2.8.1'
    compile 'org.apache.hadoop:hadoop-aws:2.8.1'
    compile 'org.apache.hadoop:hadoop-client:2.8.1'


 类似资料:
  • 我正在使用Spring引导连接到谷歌云存储。 我能够连接到一个文件,并从谷歌云存储桶中读取内容。 但是我不能得到谷歌云存储桶中所有文件的列表。 请帮帮我。 这很有效 这不工作。 有什么原因吗?

  • 问题内容: 我正在寻找使用python从s3的多个分区目录中读取数据的方法。 data_folder / serial_number = 1 / cur_date = 20-12-2012 / abcdsd0324324.snappy.parquet data_folder / serial_number = 2 / cur_date = 27-12-2012 / asdsdfsd0324324.

  • 问题内容: 我有一种使用(1.4.4),(0.4.1)和(0.20.3)实现此目的的方法。 首先,我可以像这样在本地读取单个实木复合地板文件: 我还可以像这样在本地读取实木复合地板文件的目录: 两者都像魅力。现在,我想使用存储在S3存储桶中的文件远程实现相同的目的。我希望这样的事情行得通: 但这不是: 在彻底阅读了pyarrow的文档之后,目前看来这是不可能的。因此,我提出了以下解决方案: 从S3

  • 我试图读取CSV文件从私人S3桶到熊猫数据帧: 我可以从公共存储桶中读取文件,但从私有存储桶中读取文件会导致HTTP 403:禁止错误。 我已经使用aws配置配置了AWS凭据。 我可以使用boto3从私人存储桶下载文件,boto3使用aws凭据。似乎我需要配置pandas以使用AWS凭据,但不知道如何配置。

  • 我使用prestodb和hive metastore作为模式存储,使用alluxio缓存作为数据的外部存储。alluxio和hive模式中使用的存储格式是PARQUET。同时使用配置单元目录从presto检索时间戳字段。我会跟踪错误。 列 utdate 声明为类型时间戳,但 Parquet 文件将列声明为 INT64 类型 数据集的架构为 创建表测试( utcdate timestamp ) WI

  • 问题内容: Spark解释实木复合地板的列的方式存在一些问题。 我有一个具有已确认架构的Oracle源(df.schema()方法): 然后将其另存为Parquet-df.write()。parquet()方法-具有相应的消息类型(由Spark确定): 然后,我的应用程序使用HashMap生成表DDL以进行类型转换,例如: 我的问题是Impala无法读取该表,因为它不接受LM_PERSON_ID作