如何从parquet文件中获取模式/列名称?

54

我有一个存储在HDFS上的文件,名为part-m-00000.gz.parquet

我尝试运行命令hdfs dfs -text dir/part-m-00000.gz.parquet,但它是压缩文件,所以我运行了gunzip part-m-00000.gz.parquet,但它不能解压文件,因为它不认识.parquet扩展名。

我该如何获取这个文件的模式和列名?


Apache Arrow项目支持许多编程语言,并使得用不同的编程语言获取Parquet模式变得更容易。更多细节请参见我的答案。 - Powers
8个回答

55

由于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


2
谢谢。听起来比我预期的要多很多工作! - Super_John
3
这是 parquet-tools 的更新存储库 - Matteo Guarnerio
提供的所有 Github 链接都无法使用了 :( - Itération 122442
2
parquet-tools的链接已经失效。 - Juha Syrjälä
2
工具更新链接 https://pypi.org/project/parquet-tools/ - Sandeep Singh

13

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的信息 在此处描述


1
我非常喜欢它们,比起parquet-tools更好用。 - scravy
1
parquet-tools 报错缺少页脚,但是 parquet-cli 对我来说可用。 - matmat

7
如果你的 Parquet 文件和我一样存储在 HDFS 或 S3 中,你可以尝试以下操作:
HDFS
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

希望这能帮到您。

6
如果您使用Docker,您也可以在容器中运行parquet-tools:
docker run -ti -v C:\file.parquet:/tmp/file.parquet nathanhowell/parquet-tools schema /tmp/file.parquet

最佳运行它们的方式 - scravy

3
也许可以使用桌面应用程序查看Parquet以及其他二进制格式的数据,如ORCAVRO。这是一个纯Java应用程序,因此可以在Linux、Mac和Windows上运行。有关详细信息,请查看Bigdata文件查看器
它支持数组、映射等复杂数据类型。

enter image description here


3

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的方法那样干净。


1
如果您正在使用R,下面的包装函数将适用于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"    

0

由于它不是文本文件,您无法对其执行“-text”操作。 即使您没有安装parquet-tools,也可以通过Hive轻松读取它,只要您将该文件加载到Hive表中即可。


谢谢。我希望我的当前环境没有Hive,所以我只有Pig和HDFS来进行MR。 - Super_John
3
如果你不了解镶木地板的列结构,就无法在其上创建HIVE表。 - Avinav Mishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接