【问题标题】: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 模式。有关详细信息,请参阅我的答案。

标签: hadoop apache-pig hdfs 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 以及其他二进制格式的数据,例如ORCAVRO。它是纯 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

          【讨论】:

          • 谢谢。听起来比我预期的要多得多!
          • 所提供的 github 链接都不再起作用了 :(
          • parquet-tools 链接已损坏。
          【解决方案8】:

          因为它不是一个文本文件,你不能对它做一个“-text”。 即使您没有安装 parquet-tools,您也可以通过 Hive 轻松阅读它,前提是您可以将该文件加载到 Hive 表中。

          【讨论】:

          • 谢谢。我希望 - 我当前的环境没有配置单元,所以我只有猪和 MR 的 hdfs。
          • 除非您知道 parquet 列结构,否则您将无法在其上制作 HIVE 表。
          猜你喜欢
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 2022-10-20
          • 1970-01-01
          • 2017-12-25
          • 1970-01-01
          • 1970-01-01
          • 2019-12-18
          相关资源
          最近更新 更多