Avro -> Parquet -> Spark SQL

Avro -> Parquet -> Spark SQL

我有一个 java 程序,它使用 AvroParquetWriter 创建镶木地板文件。

我可以将这些文件放在 S3 (AWS) 中。

完成后,我想创建一个外部 table 来使用 Spark SQL 查询镶木地板记录。

这可能吗?我尝试过的所有实验都表明 Spark 在查询时无法读取 AvroParquetWriter 创建的文件。

如果可以,我必须做什么?

不确定您的 AvroParquetWriter,但这对我有用,因为您可以像这样通过 spark sql 查询镶木地板文件目录...

PATH= '.../data.parquet'
spark.sql("select * from parquet.`{}`".format(PATH)).count()

您也可以像这样创建一个外部 table ...

CREATE EXTERNAL TABLE db.table
(
C1 INT,
c2 TIMESTAMP,
c3 STRING,
etc...
)
STORED AS PARQUET LOCATION '.../data.parquet'

技巧是在hadoop配置中设置WRITE_OLD_LIST_STRUCTURE,如下:

        Configuration hadoopconf = new Configuration() {{
            setBoolean(AvroWriteSupport.WRITE_OLD_LIST_STRUCTURE, false);
            this.set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.DefaultAWSCredentialsProviderChain");
        }};

        ParquetWriter<GenericRecord> writer = AvroParquetWriter.<GenericRecord>builder(path)
                .withSchema(contact_schema)
                .withConf(hadoopconf)
                .withCompressionCodec(CompressionCodecName.SNAPPY)
                .build();