我有一个存储在HDFS上的文件,名为part-m-00000.gz.parquet
我尝试运行命令hdfs dfs -text dir/part-m-00000.gz.parquet
,但它是压缩文件,所以我运行了gunzip part-m-00000.gz.parquet
,但它不能解压文件,因为它不认识.parquet
扩展名。
我该如何获取这个文件的模式和列名?
我有一个存储在HDFS上的文件,名为part-m-00000.gz.parquet
我尝试运行命令hdfs dfs -text dir/part-m-00000.gz.parquet
,但它是压缩文件,所以我运行了gunzip part-m-00000.gz.parquet
,但它不能解压文件,因为它不认识.parquet
扩展名。
我该如何获取这个文件的模式和列名?
由于Parquet文件与文本文件在磁盘上的写入方式有很大差异,因此您将无法使用hdfs dfs -text打开该文件。对于同样的问题,Parquet项目提供了parquet-tools来执行您正在尝试完成的任务。打开并查看模式、数据、元数据等。
请查看parquet-tool项目 parquet-tools
此外,Cloudera支持和大力贡献Parquet,还提供了一个很好的页面,介绍如何使用parquet-tools。从那页中选取一个适用于您的用例的示例。
parquet-tools schema part-m-00000.parquet
查看Cloudera页面。使用Parquet文件格式与Impala、Hive、Pig、HBase和MapReduce
Parquet CLI: parquet-cli 是 Parquet-Tools 的轻量级替代品。
pip install parquet-cli //installs via pip
parq filename.parquet //view meta data
parq filename.parquet --schema //view the schema
parq filename.parquet --head 10 //view top n rows
这个工具将提供关于parquet文件的基本信息。
更新(替代方案):
DuckDB有CLI工具(适用于Linux、Windows、macOS的预编译二进制文件),可用于从命令行查询parquet数据。
PS C:\Users\nsuser\dev\standalone_executable_binaries> ./duckdb
Connected to a transient in-memory database.
阅读 Parquet 模式。
D DESCRIBE SELECT * FROM READ_PARQUET('C:\Users\nsuser\dev\sample_files\userdata1.parquet');
OR
D SELECT * FROM PARQUET_SCHEMA('C:\Users\nsuser\dev\sample_files\userdata1.parquet');
┌───────────────────┬─────────────┬──────┬─────┬─────────┬───────┐
│ column_name │ column_type │ null │ key │ default │ extra │
├───────────────────┼─────────────┼──────┼─────┼─────────┼───────┤
│ registration_dttm │ TIMESTAMP │ YES │ │ │ │
│ id │ INTEGER │ YES │ │ │ │
│ first_name │ VARCHAR │ YES │ │ │ │
│ salary │ DOUBLE │ YES │ │ │ │
└───────────────────┴─────────────┴──────┴─────┴─────────┴───────┘
更多有关DuckDB的信息 在此处描述。
parquet-tools schema hdfs://<YOUR_NAME_NODE_IP>:8020/<YOUR_FILE_PATH>/<YOUR_FILE>.parquet
S3
parquet-tools schema s3://<YOUR_BUCKET_PATH>/<YOUR_FILE>.parquet
docker run -ti -v C:\file.parquet:/tmp/file.parquet nathanhowell/parquet-tools schema /tmp/file.parquet
Apache Arrow 使得获取 Parquet 元数据变得容易,支持多个语言,包括 C、C++、Rust、Go、Java、JavaScript 等等。
以下是使用 PyArrow (Python 的 Apache Arrow API) 获取架构的方法:
import pyarrow.parquet as pq
table = pq.read_table(path)
table.schema # pa.schema([pa.field("movie", "string", False), pa.field("release_year", "int64", True)])
点击这里可查看如何使用PyArrow从Parquet文件读取元数据信息的更多详细信息。
你也可以使用Spark获取Parquet文件的模式。
val df = spark.read.parquet('some_dir/')
df.schema // returns a StructType
StructType对象的结构如下:
StructType(
StructField(number,IntegerType,true),
StructField(word,StringType,true)
)
从StructType对象中,您可以推断出Parquet元数据中的列名称、数据类型和可空属性。Spark的方法不像Arrow的方法那样干净。
read_parquet_schema <- function (file, col_select = NULL, as_data_frame = TRUE, props = ParquetArrowReaderProperties$create(),
...)
{
require(arrow)
reader <- ParquetFileReader$create(file, props = props, ...)
schema <- reader$GetSchema()
names <- names(schema)
return(names)
}
例子:
arrow::write_parquet(iris,"iris.parquet")
read_parquet_schema("iris.parquet")
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
由于它不是文本文件,您无法对其执行“-text”操作。 即使您没有安装parquet-tools,也可以通过Hive轻松读取它,只要您将该文件加载到Hive表中即可。