HiveContext无法读取Orc文件的模式。

3
当我运行以下代码时:
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"

注意:我按如下方式创建了表格:
create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc;

注意:这不是此问题的重复(Hadoop ORC文件-它的工作原理-如何获取元数据),因为答案告诉我使用“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>

1
可能是 Hadoop ORC 文件 - 工作原理 - 如何获取元数据 的重复问题。 - zero323
由于模式存储在元存储中,这很可能意味着您不会为两个操作使用相同的元存储,对吗? - zero323
很好的观点。但是我正在使用自己的hive-site.xml(已添加到上面的描述中),其中我复制了“hive.metastore.uris”从/etc/hive/conf/hive-site.xml。 - DilTeam
可能与激发了另一篇文章的相同的Hive错误有关:https://dev59.com/dJnga4cB1Zd3GeqPYGc1 - Samson Scharfrichter
看起来是相同的问题。所以我们需要使用 Hive 2.0 吗? - DilTeam
显示剩余2条评论
2个回答

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”,插入语句也没有保存列信息。不确定这是否是预期行为。无论如何,现在一切都正常工作了。对混淆表示歉意,但希望这能帮助未来的某个人 -:)


嗨@DilTeam,我遇到了同样的问题,请问你是如何创建测试数据的?我无法在输出文件中保留模式。 - AvneeshAtri

0

@DilTeam 这是一个问题,当你使用Hive(版本1.x)写入数据时,它不会为orc格式的文件存储列的元数据(对于parquet等格式则不同),但在新的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

我希望这能帮到你


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接