我正在尝试使用 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();
}