HiveContext不读取Orcfile的模式

时间:2016-08-02 17:12:09

标签: scala apache-spark hive orc hortonworks-sandbox

当我运行以下内容时:

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>

2 个答案:

答案 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上使用定义的架构创建数据框,这将使您能够灵活地更改数据类型,您可以在此链接中阅读

https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#programmatically-specifying-the-schema

我希望这会有所帮助