从 Azure HDFS 读取镶木地板文件

时间:2021-07-06 16:29:47

标签: java hadoop parquet azure-data-lake

我正在尝试使用 Hadoop 从 Azure Data Lake 读取镶木地板文件。 以下代码工作正常(在 Java 中):

URI uri =
        new URI("abfss://my-container@my-azure-account.blob.core.windows.net/some-path/2021/07/06/04-00-50/"
                        + "1.parquet/part-00000-360855b5-58c4-40ed-989f-a81c797cb008-c000.snappy.parquet");
HadoopInputFile file = HadoopInputFile.fromPath(new Path(uri), config);
ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord>builder(file).build();
GenericRecord record;
while ((record = reader.read()) != null) {
    System.out.println(record);
}
reader.close();

但是,如果我将 url 中的“blob”替换为“dfs”,我会收到一个异常,指出“不是 Parquet 文件。尾部的预期幻数”

java.lang.RuntimeException: abfss://my-container@my-azure-account.dfs.core.windows.net/some-path/2021/07/06/04-00-50/1.parquet/part-00000-360855b5-58c4-40ed-989f-a81c797cb008-c000.snappy.parquet is not a Parquet file. Expected magic number at tail, but found [21, 0, 21, -82]
                at org.apache.parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:556)
                at org.apache.parquet.hadoop.ParquetFileReader.<init>(ParquetFileReader.java:776)
                at org.apache.parquet.hadoop.ParquetFileReader.open(ParquetFileReader.java:657)
                at org.apache.parquet.hadoop.ParquetReader.initReader(ParquetReader.java:152)
                at org.apache.parquet.hadoop.ParquetReader.read(ParquetReader.java:135)

唯一不同的是地址中的dfs:abfss://my-container@my-azure-account.dfs.core.windows.net/some-path/2021/07/ 06/04-00-50/1.parquet/part-00000-360855b5-58c4-40ed-989f-a81c797cb008-c000.snappy.parquet。

我很确定这是一些基本的东西,但我是 hadoop 的新手,所以我可能会错过它。我做错了什么?

为了澄清,我想使用 dfs 而不是 blob url 的原因是我需要读取给定日期的文件,但我不知道包含时间和文件名的路径的其余部分(也可能有所不同)。发现我在文件系统上使用了 listFiles 方法。 完整代码如下:

URI uri = new URI("abfss://my-container@my-azure-account.blob.core.windows.net/some-path/2021/06/08");
FileSystem fs = path.getFileSystem(config);
RemoteIterator<LocatedFileStatus> it = fs.listFiles(new Path(uri), true);
while (it.hasNext()) {
    LocatedFileStatus fileStatus = it.next();
    HadoopInputFile file = HadoopInputFile.fromStatus(fileStatus, config);
    ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord>builder(file).build();
    GenericRecord record;
    while ((record = reader.read()) != null) {
        System.out.println(record);
    }
    reader.close();
}

0 个答案:

没有答案