如何获取存储在 HDFS 中的 ORC 文件的模式(列及其类型)?
How to get the schema (columns and their types) of ORC files stored in HDFS?
我将 ORC 文件存储在 HDFS 上的不同文件夹中,如下所示:
/DATA/UNIVERSITY/DEPT/STUDENT/part-00000.orc
/DATA/UNIVERSITY/DEPT/CREDIT/part-00000.orc
我不知道每个表中有多少列(STUDENT
、CREDIT
等)。有没有办法从这些文件中获取模式?我正在寻找获取列名称及其数据类型的方法,以便我可以为 Hive EXTERNAL 表编写 CREATE 语句。
通过 Spark
找到了获取我想要的详细信息(列名、数据类型)的方法
data = sqlContext.sql("SELECT * FROM orc.`<HDFS_path>`");
data.printSchema()
这将以下面的格式打印输出,这正是我想从 HDFS 上的 ORC 文件中提取的信息:
root
|-- <column_name1>: <datatype> (nullable = <true/false>)
|-- <column_name2>: <datatype> (nullable = <true/false>)
|-- <column_name3>: <datatype> (nullable = <true/false>)
|-- <column_name4>: <datatype> (nullable = <true/false>)
|-- <column_name5>: <datatype> (nullable = <true/false>)
Hive orc dump 命令将解决您的问题
hive --orcfiledump /DATA/UNIVERSITY/DEPT/STUDENT/part-00000
您将获得列、它们的类型、最小值、最大值、计数或记录以及其他更多统计信息,如下所示
Rows: 6 .
Compression: ZLIB .
Compression size: 262144 .
Type: struct<_col0:string,_col1:string> .
Stripe Statistics:
Stripe 1:
Column 0: count: 6 .
Column 1: count: 6 min: abc max: mno sum: 17 .
Column 2: count: 6 min: def max: tre sum: 18 .
File Statistics:
Column 0: count: 6 .
Column 1: count: 6 min: abc max: mno sum: 17 .
Column 2: count: 6 min: def max: tre sum: 18 .
Stripes:
Stripe: offset: 3 data: 58 rows: 6 tail: 49 index: 67 .
Stream: column 0 section ROW_INDEX start: 3 length 9 .
Stream: column 1 section ROW_INDEX start: 12 length 29 .
Stream: column 2 section ROW_INDEX start: 41 length 29 .
Stream: column 1 section DATA start: 70 length 20 .
Stream: column 1 section LENGTH start: 90 length 12 .
Stream: column 2 section DATA start: 102 length 21 .
Stream: column 2 section LENGTH start: 123 length 5 .
Encoding column 0: DIRECT .
Encoding column 1: DIRECT_V2 .
Encoding column 2: DIRECT_V2 .
/DATA/UNIVERSITY/DEPT/STUDENT/part-00000.orc
您可以使用此文件创建数据框。
val df=spark.read.option("header","true").orc("/DATA/UNIVERSITY/DEPT/STUDENT/part-00000.orc")
df.printSchema()
我将 ORC 文件存储在 HDFS 上的不同文件夹中,如下所示:
/DATA/UNIVERSITY/DEPT/STUDENT/part-00000.orc
/DATA/UNIVERSITY/DEPT/CREDIT/part-00000.orc
我不知道每个表中有多少列(STUDENT
、CREDIT
等)。有没有办法从这些文件中获取模式?我正在寻找获取列名称及其数据类型的方法,以便我可以为 Hive EXTERNAL 表编写 CREATE 语句。
通过 Spark
data = sqlContext.sql("SELECT * FROM orc.`<HDFS_path>`");
data.printSchema()
这将以下面的格式打印输出,这正是我想从 HDFS 上的 ORC 文件中提取的信息:
root
|-- <column_name1>: <datatype> (nullable = <true/false>)
|-- <column_name2>: <datatype> (nullable = <true/false>)
|-- <column_name3>: <datatype> (nullable = <true/false>)
|-- <column_name4>: <datatype> (nullable = <true/false>)
|-- <column_name5>: <datatype> (nullable = <true/false>)
Hive orc dump 命令将解决您的问题
hive --orcfiledump /DATA/UNIVERSITY/DEPT/STUDENT/part-00000
您将获得列、它们的类型、最小值、最大值、计数或记录以及其他更多统计信息,如下所示
Rows: 6 .
Compression: ZLIB .
Compression size: 262144 .
Type: struct<_col0:string,_col1:string> .
Stripe Statistics:
Stripe 1:
Column 0: count: 6 .
Column 1: count: 6 min: abc max: mno sum: 17 .
Column 2: count: 6 min: def max: tre sum: 18 .
File Statistics:
Column 0: count: 6 .
Column 1: count: 6 min: abc max: mno sum: 17 .
Column 2: count: 6 min: def max: tre sum: 18 .
Stripes:
Stripe: offset: 3 data: 58 rows: 6 tail: 49 index: 67 .
Stream: column 0 section ROW_INDEX start: 3 length 9 .
Stream: column 1 section ROW_INDEX start: 12 length 29 .
Stream: column 2 section ROW_INDEX start: 41 length 29 .
Stream: column 1 section DATA start: 70 length 20 .
Stream: column 1 section LENGTH start: 90 length 12 .
Stream: column 2 section DATA start: 102 length 21 .
Stream: column 2 section LENGTH start: 123 length 5 .
Encoding column 0: DIRECT .
Encoding column 1: DIRECT_V2 .
Encoding column 2: DIRECT_V2 .
/DATA/UNIVERSITY/DEPT/STUDENT/part-00000.orc
您可以使用此文件创建数据框。
val df=spark.read.option("header","true").orc("/DATA/UNIVERSITY/DEPT/STUDENT/part-00000.orc")
df.printSchema()