如何从镶木地板文件中获取架构/列名?

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 表。

以上是关于如何从镶木地板文件中获取架构/列名?的主要内容,如果未能解决你的问题,请参考以下文章

重命名后如何从镶木地板文件中恢复旧列值?

无法从镶木地板中读取零件文件

从镶木地板自动推断模式/有选择地将字符串转换为浮点数

熊猫:从镶木地板文件中读取前 n 行?

Spark:从镶木地板中读取一个 int 列,只要

从镶木地板表中选择在蜂巢中不返回任何内容