HiveContext 未读取 Orcfile 的模式
HiveContext is not reading schema of an Orcfile
当我运行以下内容时:
val df1 = sqlContext.read.format("orc").load(myPath)
df1.columns.map(m => println(m))
这些列打印为“_col0”、“_col1”、“_col2”等。而不是它们的真实名称,例如 'empno'、'name'、'deptno'。
当我在 Hive 中 'describe mytable' 时,它会正确打印列名,但是当我 运行 'orcfiledump' 时,它也会显示 _col0、_col1、_col2。我是否必须指定 'schema on read' 或其他内容?如果是,我该怎么做 Spark/Scala?
hive --orcfiledump /apps/hive/warehouse/mydb.db/mytable1
.....
fieldNames: "_col0"
fieldNames: "_col1"
fieldNames: "_col2"
注意:我创建的 table 如下:
create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc;
注意:这不是这个问题的重复 (Hadoop ORC file - How it works - How to fetch metadata),因为答案告诉我使用 'Hive' 并且我已经在使用 HiveContext,如下所示:
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
顺便说一下,我使用的是我自己的配置单元-site.xml,其中包含以下内容:
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://sandbox.hortonworks.com:9083</value>
</property>
</configuration>
我知道问题出在哪里了。这就是我创建测试数据的方式。我的印象是,如果我 运行 以下命令:
create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc;
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (1, 'EMP1', 100);
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (2, 'EMP2', 50);
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (3, 'EMP3', 200);
数据将以 ORC 格式创建于:/apps/hive/warehouse/mydb.db/mytable1
事实并非如此。即使我指出 'stored as orc' INSERT 语句也没有保存列信息。不确定这是否是预期的行为。无论如何,现在一切正常。对造成的混乱表示歉意,但希望这对以后的人有所帮助 -:)
@DilTeam
这就是问题所在,当您使用 Hive(版本 1.x)写入数据时,它不会存储 orc 格式文件的列元数据(parquet 等不同),此问题已在新 Hive 中修复( 2.x) 将列信息存储在元数据中,允许 spark 从文件本身读取元数据。
这是另一个选项,用于加载在 spark 中使用 Hive1 编写的 tables:
val table = spark.table(<db.tablename>)
这里的 spark 是默认的 sparkSession,它从 hive metastore 中获取 table 的信息。
还有一个选项带有更多代码块和附加信息:
在获取的 RDD 上创建具有定义模式的数据框,这将使您可以灵活地更改数据类型,您可以阅读此 link
希望对您有所帮助
当我运行以下内容时:
val df1 = sqlContext.read.format("orc").load(myPath)
df1.columns.map(m => println(m))
这些列打印为“_col0”、“_col1”、“_col2”等。而不是它们的真实名称,例如 'empno'、'name'、'deptno'。
当我在 Hive 中 'describe mytable' 时,它会正确打印列名,但是当我 运行 'orcfiledump' 时,它也会显示 _col0、_col1、_col2。我是否必须指定 'schema on read' 或其他内容?如果是,我该怎么做 Spark/Scala?
hive --orcfiledump /apps/hive/warehouse/mydb.db/mytable1
.....
fieldNames: "_col0"
fieldNames: "_col1"
fieldNames: "_col2"
注意:我创建的 table 如下:
create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc;
注意:这不是这个问题的重复 (Hadoop ORC file - How it works - How to fetch metadata),因为答案告诉我使用 'Hive' 并且我已经在使用 HiveContext,如下所示:
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
顺便说一下,我使用的是我自己的配置单元-site.xml,其中包含以下内容:
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://sandbox.hortonworks.com:9083</value>
</property>
</configuration>
我知道问题出在哪里了。这就是我创建测试数据的方式。我的印象是,如果我 运行 以下命令:
create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc;
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (1, 'EMP1', 100);
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (2, 'EMP2', 50);
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (3, 'EMP3', 200);
数据将以 ORC 格式创建于:/apps/hive/warehouse/mydb.db/mytable1
事实并非如此。即使我指出 'stored as orc' INSERT 语句也没有保存列信息。不确定这是否是预期的行为。无论如何,现在一切正常。对造成的混乱表示歉意,但希望这对以后的人有所帮助 -:)
@DilTeam 这就是问题所在,当您使用 Hive(版本 1.x)写入数据时,它不会存储 orc 格式文件的列元数据(parquet 等不同),此问题已在新 Hive 中修复( 2.x) 将列信息存储在元数据中,允许 spark 从文件本身读取元数据。 这是另一个选项,用于加载在 spark 中使用 Hive1 编写的 tables:
val table = spark.table(<db.tablename>)
这里的 spark 是默认的 sparkSession,它从 hive metastore 中获取 table 的信息。
还有一个选项带有更多代码块和附加信息:
在获取的 RDD 上创建具有定义模式的数据框,这将使您可以灵活地更改数据类型,您可以阅读此 link
希望对您有所帮助