如何从镶木地板文件中获取架构/列名?
Posted
技术标签:
【中文标题】如何从镶木地板文件中获取架构/列名?【英文标题】:How do I get schema / column names from parquet file? 【发布时间】:2016-02-26 07:16:12 【问题描述】:我有一个文件存储在 HDFS 中,名称为 part-m-00000.gz.parquet
我尝试运行hdfs dfs -text dir/part-m-00000.gz.parquet
,但它已被压缩,所以我运行gunzip part-m-00000.gz.parquet
,但它无法解压缩文件,因为它无法识别.parquet
扩展名。
如何获取此文件的架构/列名?
【问题讨论】:
Apache Arrow project 支持多种语言,可以轻松获取多种不同语言的 Parquet 模式。有关详细信息,请参阅我的答案。 【参考方案1】:如果您使用的是 R,则 箭头 库中存在的以下函数的包装函数将为您工作:
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"
【讨论】:
【参考方案2】: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 文件的基本信息。
【讨论】:
比 parquet-tools 更喜欢它们【参考方案3】:如果您使用 Docker,您还可以在容器中运行 parquet-tools:
docker run -ti -v C:\file.parquet:/tmp/file.parquet nathanhowell/parquet-tools schema /tmp/file.parquet
【讨论】:
运行它们的最佳方式【参考方案4】:也许它能够使用桌面应用程序查看Parquet 以及其他二进制格式的数据,例如ORC 和AVRO。它是纯 Java 应用程序,因此可以在 Linux、Mac 和 Windows 上运行。详情请查看Bigdata File Viewer。
支持数组、地图等复杂数据类型
【讨论】:
【参考方案5】:Apache Arrow 使用多种不同语言(包括 C、C++、Rust、Go、Java、javascript 等)轻松获取 Parquet 元数据。
以下是使用 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 文件中读取元数据信息的更多详细信息,请参阅 here。
您还可以使用 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 方法干净。
【讨论】:
【参考方案6】:如果您的 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
希望对你有帮助。
【讨论】:
【参考方案7】:您将无法使用 hdfs dfs -text “打开”该文件,因为它不是文本文件。与文本文件相比,Parquet 文件写入磁盘的方式非常不同。
同样,Parquet 项目提供 parquet 工具来执行您正在尝试执行的任务。打开并查看架构、数据、元数据等。
查看 parquet-tool 项目(简单地说,一个 jar 文件。) parquet-tools
此外,支持 Parquet 并对 Parquet 做出重大贡献的 Cloudera 也有一个不错的页面,其中包含有关使用 parquet 工具的示例。该页面中您的用例的示例是
parquet-tools schema part-m-00000.parquet
查看 Cloudera 页面。 Using the Parquet File Format with Impala, Hive, Pig, HBase, and MapReduce
【讨论】:
谢谢。听起来比我预期的要多得多! 这里是updated repository for parquet-tools。 所提供的 github 链接都不再起作用了 :( parquet-tools 链接已损坏。【参考方案8】:因为它不是一个文本文件,你不能对它做一个“-text”。 即使您没有安装 parquet-tools,您也可以通过 Hive 轻松阅读它,前提是您可以将该文件加载到 Hive 表中。
【讨论】:
谢谢。我希望 - 我当前的环境没有配置单元,所以我只有猪和 MR 的 hdfs。 除非您知道 parquet 列结构,否则您将无法在其上制作 HIVE 表。以上是关于如何从镶木地板文件中获取架构/列名?的主要内容,如果未能解决你的问题,请参考以下文章