当我运行以下内容时:
val df1 = sqlContext.read.format("orc").load(myPath)
df1.columns.map(m => println(m))
列打印为'_col0','_ col1','_ col2'等。与其真实姓名相反,例如'empno','name','deptno'。
当我在Hive中描述mytable'时,它会正确打印列名,但是当我运行'orcfiledump'时,它也会显示_col0,_col1,_col2。我是否必须指定“架构上的读取”或其他内容?如果是,我如何在Spark / Scala中执行此操作?
hive --orcfiledump /apps/hive/warehouse/mydb.db/mytable1
.....
fieldNames: "_col0"
fieldNames: "_col1"
fieldNames: "_col2"
注意:我按如下方式创建了表:
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)
顺便说一句,我使用的是自己的hive-site.xml,其中包含以下内容:
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://sandbox.hortonworks.com:9083</value>
</property>
</configuration>
答案 0 :(得分:0)
我弄清楚问题是什么。这是我创建测试数据的方式。我的印象是,如果我运行以下命令:
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
事实证明并非如此。即使我表示存储为orc&#39; INSERT语句没有保存列信息。不确定这是否是预期的行为。无论如何,它现在都有效。为这种混乱道歉,但希望这将有助于未来的人 - :)
答案 1 :(得分:0)
@DilTeam 这就是问题所在,当您使用Hive(版本1.x)写入数据时,它不存储orc格式文件的列元数据(对于镶木地板等则不一样),此问题已在新的Hive(2)中修复。 x)将列信息存储在元数据中,从而使spark可以从文件本身读取元数据。 这是另一个在Spark中加载用Hive1编写的表的选项:
val table = spark.table(<db.tablename>)
这里的spark是默认的sparkSession,它从hive metastore获取表的信息。
另一个选项带有更多代码块和详细信息:
在获取的RDD上使用定义的架构创建数据框,这将使您能够灵活地更改数据类型,您可以在此链接中阅读
我希望这会有所帮助